将参数从父级传递到子级ASP GridView(C#codebehind)
我嵌套了三个GridView,每个GridView都依赖于前面的GridView。我已经完成了asp结构,并且每个都从各自的数据源(aspx页面中的asp:SqlDataSource)提取数据。但是,我不知道如何构建关系,以便每个都只提取与网格嵌套的行相关的数据 示例: 这些示例帮助我理解了我需要RowDataBound事件来实现这一点。伟大的但我不知道如何让RowDataBound事件为每行提供唯一的参数,该参数必须通过在下一个GridView中生成数据的数据源运行 代码隐藏:将参数从父级传递到子级ASP GridView(C#codebehind),c#,asp.net,gridview,C#,Asp.net,Gridview,我嵌套了三个GridView,每个GridView都依赖于前面的GridView。我已经完成了asp结构,并且每个都从各自的数据源(aspx页面中的asp:SqlDataSource)提取数据。但是,我不知道如何构建关系,以便每个都只提取与网格嵌套的行相关的数据 示例: 这些示例帮助我理解了我需要RowDataBound事件来实现这一点。伟大的但我不知道如何让RowDataBound事件为每行提供唯一的参数,该参数必须通过在下一个GridView中生成数据的数据源运行 代码隐藏: p
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> <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> <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>
首先,我建议更改
参数,这看起来是错误的。假设CatLinkULink
是一个字符串字段,我会将SelectParameters更改为:
<SelectParameters>
<asp:Parameter Name="catlinkulink" Type="String" DefaultValue="" />
</SelectParameters>
免责声明:我没有测试上面的代码,它可能需要调整 您可以在hiden div中设置文本框,以在触发grid selected事件时获取值。
然后可以在sqldatasource中将参数设置为textbox.text。
这就是我在这种情况下所做的在行绑定事件中设置asp:parameter值,如下所示:TargetLinks.SelectParameters[0]。DefaultValue=catlinkulink;谢谢我已经添加了。@R\u Scott-您得到的错误是什么,您刚刚在注释中发布了代码?对不起,我将错误放在注释中,结果很糟糕,因此我更新了原始文章以提高可读性。这是一个“对象引用未设置为实例…”错误。在VS中没有显示出任何问题,因此我试图弄清楚为什么数据键没有在行数据绑定事件中传递。可能您正在它自己的行中寻找gridview。你能发布GridView的标记吗?我还是不能让它工作。不过,我相信这是我的失败。我将继续玩弄它,看看我能想出什么,但我相信我现在必须放弃它,为我找到一个更简单的途径,尽管可能会有更多的用户点击。无论如何,最后期限迫在眉睫,所以我必须继续前进。我感谢您的帮助,我相信这一切都会有好处,所以再次感谢您。如果可以的话,您可以将来源发送给我。我将查看它们,在明天早上之前提出任何有效的解决方案。我终于取得了一些进展。我应该说你取得了一些进展,因为这是你的代码建议。我已将sqldatasource移动到gridview中,但将其放置在错误的父/子嵌套级别。非常感谢你慷慨地为我做这件事。我讨厌别人替我做事,但我感到非常沮丧。我想我应该能够使用上述类别的鸟巢,以及是好的。我对你感激不尽。
<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> <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;
}
}
}