【问题标题】:How to make an autogenerated gridview with buttons in each dynamic column?如何使用每个动态列中的按钮制作自动生成的网格视图?
【发布时间】:2018-02-13 13:58:25
【问题描述】:

我需要从下表布局的旋转版本中创建一个网格视图:Person 1..N PersonDate N...1 Date: i.e.

        Person                       PersonDate            Date
   PersonID  Person            PersonID DateID Flag        DateID Date
   1         John              1        1      Y           1      01/01/2018
   2         Jane              1        2      N           2      02/01/2018
                               2        2      N

但是我需要把它转成一个gridview,这样gridview的列结构看起来像:

Person  01/01/2018  02/01/2018
John    Y           N
Jane                N

随着添加更多日期,动态生成列。我通过使用数据表实现了这一点。但是我还需要在gridview结果的每个单元格中添加一个按钮来切换标志。

如何将按钮插入到运行时才存在的列中?我考虑过使用onrowcreated,但是当单击一个按钮时如何区分按钮?

或者,有没有更好的方法来实现这一点?

【问题讨论】:

    标签: asp.net gridview webforms


    【解决方案1】:

    假设生成的 DataTable 如下所示:

    protected void Page_Load(object sender, EventArgs e)
    {
        var table = new DataTable();
        table.Columns.Add("Person");
        table.Columns.Add("01/01/2018");
        table.Columns.Add("02/01/2018");
        table.Rows.Add("John", "Y", "N");
        table.Rows.Add("Jane", "N", "N");
    
        grvTest.DataSource = table;
        grvTest.RowDataBound += GrvTest_RowDataBound;
        grvTest.RowCommand += GrvTest_RowCommand;
        grvTest.DataBind();
    }
    

    您可以使用 RowDataBound 事件来添加按钮。要识别单击按钮的人员/日期组合,您可以将必要的数据设置为您添加的按钮的 CommandArgument。数据可以是人员和日期条目的 ID。我使用了显示值来简化示例:

    private void grvTest_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType != DataControlRowType.DataRow)
            return;
    
        for (int i = 1; i < e.Row.Cells.Count; i++)
        {
            var row = (DataRowView)e.Row.DataItem;
            var currentPerson = row[0].ToString();
            var currentDate = row.DataView.Table.Columns[i];
            var commandArgument = currentPerson + ":" + currentDate;
            var button = new Button {Text = row[i].ToString(), CommandName = "Toggle", CommandArgument = commandArgument };
            e.Row.Cells[i].Controls.Add(button);
        }
    }
    

    在 RowCommand 事件中,您可以再次访问该参数:

    private void GrvTest_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        Response.Write(e.CommandArgument);
    }
    

    如果您不想连接这两个值,您也可以使用按钮的任意附加属性,例如button.Attributes.Add("data-person-id",somevalue).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 2021-08-24
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多