Динамический флажок в gridview

У меня есть веб-приложение c # aspx, которое предназначено для генерации большинства своих компонентов на лету. Есть этот GridView, который предназначен для отображения некоторых флажков.

Странно то, что он показывает не запущенный компонент, а пространство имен, то есть System.UI.Webcontrols.CheckBox.

Мне нужно увидеть флажок; как это исправить?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound" />
    </div>
    </form>
</body>
</html>

[aspx.cs]

namespace ChkBoxOnGridView
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            PopulateGridView();
        }
        protected void GridView1_RowDataBound(Object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                CheckBox cb = new CheckBox();
                e.Row.Cells[1].Controls.Add(cb);
            }
        }

        private void PopulateGridView()
        {
            GridView1.DataSource = null;
            GridView1.Columns.Clear();

            DataTable dt = new DataTable();

            dt.Columns.Add(new DataColumn("DTA", typeof(System.String)));
            dt.Columns.Add(new DataColumn("Is Visible", typeof(System.Web.UI.WebControls.CheckBox)));

            CheckBox chkbx = new CheckBox();
            chkbx.Checked = true;

            DataRow row1 = dt.NewRow();
            row1["DTA"] = "Some Text";
            row1["Is Visible"] = chkbx;
            dt.Rows.Add(row1);

            foreach (DataColumn col in dt.Columns)
            {
                BoundField bField = new BoundField();
                bField.DataField = col.ColumnName;
                bField.HeaderText = col.ColumnName;
                GridView1.Columns.Add(bField);
            }

            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    }
}

person antowizzy    schedule 08.05.2012    source источник


Ответы (2)


Вам нужно создать каждый объект индивидуально в каждой строке, используя событие GridView.RowdataBound.

Вы можете добавить его, используя e.Row.Cells[]

Но чтобы убедиться, что вы создаете его в нужном месте, вы должны в этом случае проверить, что вы находитесь в строке, которая не является верхним или нижним колонтитулом или пейджером. Вы делаете это, проверяя GridViewRow.RowType Свойство e.Row и проверьте, DataRow

 void CustomersGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{

  if(e.Row.RowType == DataControlRowType.DataRow)
  {
    CheckBox cb = new CheckBox();
    // cb.id = ... and other control setup
    // add your control here:
    e.Row.Cells[0].Controls.Add(cb);
  }
}
person JotaBe    schedule 08.05.2012
comment
Не могли бы вы показать мне рабочую модель, основанную на моем коде, я новичок в С #. - person antowizzy; 09.05.2012
comment
В том, что я вам показываю, нет ничего сложного. Однако я поясню, что вам просто нужно привязать DataBind к своему CustomerGridView и обработать его событие RowDataBound с помощью кода, подобного показанному. Вы можете получить доступ к данным, связанным с каждой строкой, приводящей e.Row.DataItem к вашему классу модели, так что вы можете легко получить доступ к его свойствам, чтобы решить, как вы добавляете свой элемент управления. - person JotaBe; 09.05.2012
comment
Как мне заставить cb принять проверенный статус chkbx, а также удалить третий столбец, который является повторением первого столбца? Я обновил код. - person antowizzy; 09.05.2012

Подводя итоги, я бы сказал, что вы не можете удерживать контроль в DataTable. [Видимо] должно быть логическим значением.

Я бы добавил столбцы в событие On Init, используя столбец шаблона. См. Этот вопрос SO: Добавление динамических столбцов в ASP.NET Gridview

person Jon P    schedule 08.05.2012