【问题标题】:Dynamic checkbox on gridview网格视图上的动态复选框
【发布时间】:2012-05-08 22:15:59
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    您需要使用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);
      }
    }
    

    【讨论】:

    • 能否请您根据我的代码向我展示一个工作模型,我对 c# 很陌生。
    • 我向您展示的内容并不难。但是,我要明确一点,您只需对 CustomerGridView 进行 DataBind,并使用如图所示的代码处理其 RowDataBound 事件。您可以访问与将 e.Row.DataItem 转换为模型类的每一行关联的数据,以便您可以轻松访问其属性以决定如何添加控件。
    • 如何使 cb 获取 chkbx 的已检查状态并删除与第一列重复的第三列?我已经更新了代码。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-22
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      相关资源
      最近更新 更多