我在asp.net 2.0中有一个带有行选择链接的数据绑定GridView。当选择一行时,我想以编程方式在所选行下面添加一个表行,以便嵌套另一个网格等。
我正在为客户和一篇文章研究这个问题,我认为今晚我的google-fu并不强大。有什么建议吗?
编辑:我实际上有一个可行的解决方案,但Visual Studio以某种方式被搞砸了;关闭并重新开放VS并重建一切解决了问题; - )我的解决方案发布在下面,请告诉我如何尽可能做得更好。谢谢!
答案 0 :(得分:8)
我想我明白了。这是一个似乎有效的解决方案。它可以使用用户控件进行改进,但这是它的要点:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow &&
(e.Row.RowState & DataControlRowState.Selected) > 0)
{
Table tbl = (Table)e.Row.Parent;
GridViewRow tr = new GridViewRow(e.Row.RowIndex + 1, -1,
DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
TableCell tc = new TableCell();
tc.ColumnSpan = GridView1.Columns.Count;
tc.Controls.Add(
makeChildGrid(Convert.ToInt32(
((DataRowView)e.Row.DataItem)["ROW_ID_FIELD"])));
tr.Cells.Add(tc);
tbl.Rows.Add(tr);
}
}
protected GridView makeChildGrid(int id)
{
GridView gv = new GridView();
SqlDataSource sqlds = new SqlDataSource();
sqlds.DataSourceMode = SqlDataSourceMode.DataSet;
sqlds.ConnectionString = SqlDataSource1.ConnectionString;
sqlds.SelectCommand = "SELECT * from MY_TABLE_NAME " +
"WHERE KEY_FIELD = " + id.ToString();
DataView dv = (DataView)sqlds.Select(DataSourceSelectArguments.Empty);
gv.DataSource = dv;
gv.DataBind(); //not sure this is necessary...?
return gv;
}
答案 1 :(得分:1)
感谢您分享此代码。
我正在尝试做同样的事情(创建嵌套的gridview),但实际上,您不必自己创建gridview。相反,您可以将控件包装在标签中。 我在这里看到了一个例子http://www.codeproject.com/KB/aspnet/EditNestedGridView.aspx?msg=3089755#xx3089755xx
你会看到开发人员只是通过在标签中包装第二个gridview控件来嵌套gv控件。
如果你可以通过代码做他正在做的事情,它会更有效。您不需要显示所有选定的字段!此外,您可以直观地将一些控件添加到您的子gridview中。
我已将您的代码转换为vb并完美运行。
由于