如何使用每个动态列中的按钮创建自动生成的gridview?

时间:2018-02-13 13:58:25

标签: asp.net gridview webforms

我需要在下表布局的旋转版本中创建一个gridview:Person 1..N PersonDate N ... 1 Date:ie

        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,但是当点击一个按钮时如何区分按钮?

或者,是否有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分: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( “数据人-ID”,someValue中)。