尝试添加二级嵌套表但未成功

本文关键字:嵌套 二级 未成功 添加 | 更新日期: 2023-09-27 18:25:05

我正在尝试学习如何在firstLevelGrid中添加额外的嵌套表,但没有成功。如有任何帮助,我们将不胜感激。尤其是在创建二级网格时,我在管理OnRowDataBound方面做了一些错误的事情,包括标记和后面的代码。

这是我生成网格和第一级的代码。我没有添加我对二级网格的尝试,只是为了避免混淆代码。这不是家庭作业,我不是一个专业的程序员,我是一个无私的人。

<div>
        <asp:GridView ID="zeroLevelGrid" runat="server" AutoGenerateColumns="false" CssClass="Grid"
            DataKeyNames="Code" OnRowDataBound="OnRowDataBoundZeroLevel">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <img alt="" style="cursor: pointer" src="images/plus.png" />
                        <asp:Panel ID="firstLevelPanel" runat="server" Style="display: none">
                            <asp:GridView ID="firstLevelGrid" runat="server" AutoGenerateColumns="false" CssClass="ChildGrid">
                                <Columns>
<!-- Here is where I add the second level grid copying the entire block "TemplateFiled" of the firstLevelGrid and renaming it secondLevel...-->
                                    <asp:BoundField ItemStyle-Width="150px" DataField="Id" HeaderText="Id" />
                                    <asp:BoundField ItemStyle-Width="150px" DataField="Code" HeaderText="Code" />
                                    <asp:BoundField ItemStyle-Width="150px" DataField="Description" HeaderText="Description" />
                                    <asp:BoundField ItemStyle-Width="150px" DataField="Quantity" HeaderText="Quantity" />
                                </Columns>
                            </asp:GridView>
                        </asp:Panel>
                    </ItemTemplate>
                </asp:TemplateField>
                 <asp:BoundField ItemStyle-Width="150px" DataField="Id" HeaderText="Id" />
                 <asp:BoundField ItemStyle-Width="150px" DataField="Code" HeaderText="Code" />
                 <asp:BoundField ItemStyle-Width="150px" DataField="Description" HeaderText="Description" />
                 <asp:BoundField ItemStyle-Width="150px" DataField="Quantity" HeaderText="Quantity" />
            </Columns>
        </asp:GridView>

和我的c#代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        zeroLevelGrid.DataSource = GetData("select top 10 * from Table_xx");//top10 only for test purposes
        zeroLevelGrid.DataBind();
    }
}
private static DataTable GetData(string query)
{
    string strConnString = ConfigurationManager.ConnectionStrings["Test1ConnectionString"].ConnectionString;
    using (SqlConnection con = new SqlConnection(strConnString))
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.CommandText = query;
            using (SqlDataAdapter sda = new SqlDataAdapter())
            {
                cmd.Connection = con;
                sda.SelectCommand = cmd;
                using (DataSet ds = new DataSet())
                {
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    return dt;
                }
            }
        }
    }
}
protected void OnRowDataBoundZeroLevel(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string code = zeroLevelGrid.DataKeys[e.Row.RowIndex].Value.ToString();
        GridView firstLevelGrid = e.Row.FindControl("firstLevelGrid") as GridView;
        firstLevelGrid.DataSource = GetData(string.Format("IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'{0}')) SELECT * from [{0}]", code));
        firstLevelGrid.DataBind();
    }
  }
  //here is where I add an OnRowDataBound event copying the above one as OnRowDataBoundFirstLevel
  //but then I get lost...
}

如果有人能告诉我如何在与之相同的firstLevelGrid中添加额外级别的嵌套网格,我会很高兴。我很乐意提供奖金来完成这项工作,但不幸的是,我还没有足够的代表。非常感谢。

尝试添加二级嵌套表但未成功

类似于您的firstLevelGrid,您必须将firstLevelGrid中的第三级网格声明为模板列

<asp:TemplateField>
    <ItemTemplate>
        <asp:GridView ID="secondLevelGrid"  runat="server" AutoGenerateColumns="false" CssClass="ChildGrid">
                    <Columns>
                        <%--Your columns go here--%>
                        </Columns>
            </asp:GridView>
    </ItemTemplate>
</asp:TemplateField>

然后为第一个LevelGrid 处理OnRowDataBound事件

OnRowDataBound="firstLevelGrid_OnRowDataBound"

在RowDataBound事件中,您可以获得网格视图、数据键并绑定子网格

protected void firstLevelGrid_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        GridView firstLevelGrid = e.Row.NamingContainer as GridView;
        string code = firstLevelGrid.DataKeys[e.Row.RowIndex].Value.ToString();
        GridView secondLevelGridView = e.Row.FindControl("secondLevelGrid") as GridView;
        secondLevelGridView.DataSource = //GetData
        secondLevelGridView.DataBind();
    }
}