【问题标题】:Pass a parameter from parent to child ASP GridView (C# codebehind)将参数从父级传递给子级 ASP GridView(C# 代码隐藏)
【发布时间】:2013-11-01 19:16:31
【问题描述】:

我嵌套了三个 GridView,每个都依赖于前一个。我已经完成了 asp 结构,并且每个都从各自的数据源中提取(aspx 页面中的 asp:SqlDataSource)。但是,我不知道如何建立关系,所以每个都只提取与网格嵌套的行相关的数据。

示例: Similar but I don't need the drill downs

Also very like what I'm looking for but this uses EntityDataSource

这些示例帮助我理解我需要 RowDataBound 事件来完成这项工作。伟大的!但我不知道如何让 RowDataBound 事件为我提供每行的唯一参数,该参数必须通过我的数据源运行,在下一个 GridView 中生成数据。

代码隐藏:

    protected void CategoryGrid_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    //need to set my @catlinkulink parameter here
}

protected void CategoryGrid_SelectedIndexChanged(object sender, EventArgs e)
{

}


protected void CategoryOnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        GridView CategoryGridFC = DomainGrid.Rows[e.Row.RowIndex].FindControl("CategoryGrid") as GridView;
        string catlinkulink = CategoryGridFC.DataKeys[e.Row.RowIndex].Values["catlinkulink"].ToString();

        TargetLinks.SelectParameters[0].DefaultValue = catlinkulink;
    }
}

这里是来自aspx的数据源。这适用于依赖于从前面的类别网格的每一行中提取的参数的网格。

    <asp:SqlDataSource ID="TargetLinks" runat="server"
ConnectionString="<%$ ConnectionStrings:MyDB %>"
SelectCommand="SELECT t.ULink AS targetlinkulink, TargetDE
               FROM targetLink t
                  INNER JOIN IntTargets it ON t.TargetULink = it.ULink
                  INNER JOIN IntCategoryLink cl ON t.CatLinkULink = cl.ULink
                  WHERE t.CatLinkULink = @catlinkulink"
>
<SelectParameters>
   <asp:Parameter Name="catlinkulink" DefaultValue="0" Type="Empty" Size="0" ConvertEmptyStringToNull="False" DbType="Object" />
</SelectParameters>

</asp:SqlDataSource>

我很抱歉这么长时间,但我想确保我提供了足够的信息,以便清楚地了解我正在尝试做什么。感谢您提供的任何意见。我总是在这里学到很多东西——即使这是完成某事的不同或更好的方式。

我根据以下建议添加了 TargetLinks 位。我还更改了 CategoryGrid 的 FindControl 以查看 DomainGrid(其父级)的行,但这也不起作用。

错误:索引超出范围。必须是非负数且小于集合的大小。 参数名称:索引

这是嵌套 GridView 的代码。

    <asp:GridView ID="DomainGrid" runat="server" 
    onselectedindexchanged="DomainGrid_SelectedIndexChanged" 
    DataSourceID="DomainLinks" AutoGenerateColumns="False" DataKeyNames="domainlinkulink">
    <Columns>

        <asp:BoundField DataField="DomainDE" ShowHeader="False" 
                SortExpression="DomainDE" HeaderStyle-Width="125">      
        </asp:BoundField>

        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:DropDownList ID="IntervCatDrop" runat="server" DataSourceID="IntervCatDD"
                 DataValueField="ulink" DataTextField="IntCategories">
                </asp:DropDownList>&nbsp;<asp:Button ID="AddIntCat" runat="server" Text="+" />
            </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:GridView ID="CategoryGrid" runat="server" DataKeyNames="catlinkulink"
                DataSourceID="IntCategoryLinks" AutoGenerateColumns="false"
                onselectedindexchanged="CategoryGrid_SelectedIndexChanged"
                onrowdatabound="CategoryOnRowDataBound">
                <Columns>

                    <asp:BoundField DataField="IntCategories" ShowHeader="False" 
                        SortExpression="Categories" HeaderStyle-Width="125"></asp:BoundField>

                    <asp:TemplateField ShowHeader="False">
                         <ItemTemplate>
                              <asp:DropDownList ID="TargetDrop" runat="server" DataSourceID="TargetsDD"
                               DataValueField="ulink" DataTextField="TargetDE">
                               </asp:DropDownList>&nbsp;<asp:Button ID="AddTarget" runat="server" Text="+" />
                         </ItemTemplate>
                   </asp:TemplateField>    

                  <asp:TemplateField ShowHeader="false">
                    <ItemTemplate>
                            <asp:GridView ID="TargetGrid" runat="server" DataSourceID="TargetLinks" AutoGenerateColumns="False"
                            DataKeyNames="targetlinkulink" onselectedindexchanged="TargetGrid_SelectedIndexChanged"
                            >
                                <Columns>
                                    <asp:BoundField DataField="TargetDE" ShowHeader="false" SortExpression="TargetDE" />
                                </Columns>
                            </asp:GridView>
                        </ItemTemplate>
                  </asp:TemplateField>

                </Columns>
                </asp:GridView>
            </ItemTemplate>            
        </asp:TemplateField>
    </Columns>





</asp:GridView>

【问题讨论】:

  • 在行绑定事件中设置 asp:parameter 值,如下所示:TargetLinks.SelectParameters[0].DefaultValue = catlinkulink;
  • 谢谢!我已经添加了。
  • @R_Scott - 你得到的错误是什么,你刚刚在评论中发布了代码?
  • 对不起,我把错误放在评论里,结果一团糟,所以我更新了原始帖子以提高可读性。这是“对象引用未设置为实例...”错误。在 VS 中没有任何问题,所以我试图弄清楚为什么数据键没有在行数据绑定事件中传递。
  • 可能你正在寻找它自己的行内的gridview。您可以发布网格视图的标记吗?

标签: c# asp.net gridview


【解决方案1】:

首先,我建议更改Parameter,这看起来不对。假设 CatLinkULink 是一个字符串字段,我会将 SelectParameters 更改为:

<SelectParameters>
    <asp:Parameter Name="catlinkulink" Type="String" DefaultValue=""  />
</SelectParameters>

并在 CategoryGrid 中移动 SqlDataSource,添加一个隐藏字段。以下是 CategoryGrid 标记的外观:

<asp:gridview id="CategoryGrid" runat="server" datakeynames="catlinkulink"
    datasourceid="IntCategoryLinks" autogeneratecolumns="false"
    onselectedindexchanged="CategoryGrid_SelectedIndexChanged"
    onrowdatabound="CategoryOnRowDataBound">
    <Columns>
        <asp:BoundField DataField="IntCategories" ShowHeader="False"
            SortExpression="Categories" HeaderStyle-Width="125"></asp:BoundField>
        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:DropDownList ID="TargetDrop" runat="server" DataSourceID="TargetsDD"
                    DataValueField="ulink" DataTextField="TargetDE">
                </asp:DropDownList>&nbsp;<asp:Button ID="AddTarget" runat="server" Text="+" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ShowHeader="false">
            <ItemTemplate>
                <asp:GridView ID="TargetGrid" runat="server" DataSourceID="TargetLinks" AutoGenerateColumns="False"
                    DataKeyNames="targetlinkulink" OnSelectedIndexChanged="TargetGrid_SelectedIndexChanged">
                    <Columns>
                        <asp:BoundField DataField="TargetDE" ShowHeader="false" SortExpression="TargetDE" />
                    </Columns>
                </asp:GridView>
                <asp:HiddenField ID="hdnCatlinkulink" runat="server" Value='<%#Eval("catlinkulink") %>' />
                <asp:SqlDataSource ID="TargetLinks" runat="server"
                ConnectionString="<%$ ConnectionStrings:MyDB %>"
                SelectCommand="SELECT t.ULink AS targetlinkulink, TargetDE
                                FROM targetLink t
                                    INNER JOIN IntTargets it ON t.TargetULink = it.ULink
                                    INNER JOIN IntCategoryLink cl ON t.CatLinkULink = cl.ULink
                                    WHERE t.CatLinkULink = @catlinkulink">
                    <SelectParameters>
                        <asp:Parameter Name="catlinkulink" Type="String" DefaultValue=""  />
                    </SelectParameters>
                </asp:SqlDataSource>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:gridview>

我会在代码中设置参数:

protected void CategoryOnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        GridView TargetGrid = e.Row.FindControl("TargetGrid") as GridView;
        HiddenField hdnCatlinkulink = e.Row.FindControl("hdnCatlinkulink") as HiddenField;
        SqlDataSource TargetLinks = e.Row.FindControl("TargetLinks") as SqlDataSource;

        if (TargetGrid != null && hdnCatlinkulink != null && TargetLinks != null)
        {
            string catlinkulink = hdnCatlinkulink.Value;
            TargetLinks.SelectParameters[0].DefaultValue = catlinkulink;
        }
    }
}

免责声明:我没有测试上面的代码,它可能需要调整。

【讨论】:

  • 我仍然无法让它工作。不过,我敢肯定,这是我的失败。我将继续玩弄它,看看我能弄清楚什么,但我相信我现在必须放弃它并为我找到一条更简单的路径,尽管用户可能会点击更多。不管怎样,最后期限迫在眉睫,所以我必须继续前进。感谢您的帮助,我相信这一切都会有帮助,所以再次感谢您。
  • 如果没问题,你可以把源发给我。我会看看他们,在明天早上提出任何可行的解决方案。
  • 我终于取得了一些进展。我应该说你取得了一些进展,因为这是你的代码建议。我已将 sqldatasource 移动到 gridview 中,但我将它放置在错误的父/子嵌套级别。非常感谢你慷慨地为我工作。我讨厌让别人为我做我的工作,但我感到非常沮丧。我想我应该也可以将它用于上述类别的巢,并且没问题。我感激不尽。
【解决方案2】:

您可以在隐藏的 div 中设置一个文本框,以便在触发网格选择事件时获取值。 然后你可以在 sqldatasource 中为这个 textbox.text 设置参数。 这就是我为这种情况所做的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多