我需要在下表布局的旋转版本中创建一个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,但是当点击一个按钮时如何区分按钮?
或者,是否有更好的方法来实现这一目标?
答案 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中)。