gridview上的动态复选框

时间:2012-05-08 22:15:59

标签: c# asp.net gridview

我有一个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();
        }
    }
}

2 个答案:

答案 0 :(得分:2)

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

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

添加它

但是,为了确保您在正确的位置创建它,您必须在此事件中检查您所在的行不是页眉或页脚,还是寻呼机。您可以通过查看e.Row的GridViewRow.RowType Property并检查它是否为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);
  }
}

答案 1 :(得分:1)

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

我将使用模板列在On Init事件中添加列。看到这个问题: Adding dynamic columns to an ASP.NET Gridview