0

我有一个 c# aspx web 应用程序,旨在动态生成其大部分组件。有这个 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();
        }
    }
}
4

2 回答 2

2

您需要使用GridView.RowdataBound 事件在每一行中单独创建每个对象。

您可以使用e.Row.Cells[]

但是,为了确保您在正确的位置创建它,您必须在此事件中检查您所在的行不是页眉或页脚或寻呼机。您可以通过检查e.Row的GridViewRow.RowType 属性并检查它是否为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);
  }
}
于 2012-05-08T22:23:36.547 回答
1

我会说你不能在 DataTable 中控制控件。[Is Visible] 应该是一个布尔值

我将使用模板列在 On Init 事件中添加列。请参阅这个 SO 问题: 向 ASP.NET Gridview 添加动态列

于 2012-05-08T22:38:16.143 回答