我正在嵌套三个 GridView,每个都依赖于之前的一个。我已经完成了 asp 结构,并且每个都从各自的数据源中提取(aspx 页面中的 asp:SqlDataSource)。但是,我不知道如何建立关系,所以每个都只提取与网格嵌套的行相关的数据。
示例: 类似,但我不需要向下钻取
也非常像我正在寻找的,但这使用 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(其父级)的行,但这也不起作用。
错误:索引超出范围。必须是非负数且小于集合的大小。参数名称:索引
这是嵌套 GridViews 的代码。
<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>