5

我在 asp.net 2.0 中有一个带有行选择链接的数据绑定 GridView。选择行时,我希望以编程方式在所选行下方添加表行,以嵌套另一个Grid等。

我正在为一个客户和一篇文章研究这个,我认为我的 google-fu 今晚并不强。有什么建议么?

编辑:我实际上有一个可行的解决方案,但 Visual Studio 不知何故被搞砸了;关闭并重新打开 VS 并重建一切解决了问题;-)

我的解决方案发布在下面,如果可能的话,请告诉我如何使它变得更好。谢谢!

4

2 回答 2

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;
}
于 2008-10-08T02:52:08.337 回答
1

感谢您分享此代码。

我正在尝试做同样的事情(创建嵌套的gridview),但实际上,您不必自己创建gridview。相反,您可以将控件包装在标签中。我在这里看到了一个例子http://www.codeproject.com/KB/aspnet/EditNestedGridView.aspx?msg=3089755#xx3089755xx

您会看到开发人员仅通过将第二个 gridview 控件包装在标签中来嵌套 gv 控件。

如果您可以通过代码完成他正在做的事情,那将更有效率。您不需要显示所有选定的字段!此外,您可以在视觉上将一些控件添加到您的子网格视图中。

我已将您的代码转换为 vb 并且运行良好。

谢谢

于 2009-06-24T05:27:31.957 回答