I am using nested repeaters to build a table for reasons I won't discuss here, but what I'm looking to do is have two datasources, one for the top level repeater that will correspond to the rows, and one for the second level repeater that will return cells within a row.
What I'm wondering, however, is if I can somehow specify a parameter in the nested repeater's datasource that is set a field in the results from the first datasource?
Can I set a parameter to the value of a data binding expression?
The reason I want to do this is I have two stored procedures. When the page is loaded I have a session parameter I can use to run the first stored procedure, however, for the second stored procedure, I need to associate a value from each instance of the top level repeater with a call to the second stored procedure with a different parameter value.
I did this by using a HiddenField to store a value to use as a parameter later. Gets the job done.
<asp:SqlDataSource ... />
<asp:Repeater ...>
<ItemTemplate>
<asp:HiddenField ID="txtOuterID" runat="server" Value='<%# Eval("ID") %>' Visible="false" />
<asp:SqlDataSource ...>
<SelectParameters>
<asp:ControlParameter Name="OuterID" Type="Int32" ControlID="txtOuterID" PropertyName="Value" />
</SelectParameters>
</asp:SqlDataSource>
<asp:Repeater ...>
</ItemTemplate>
</asp:Repeater>
I think the best way would be to handle the ItemDataBound event of the Outer Repeater, Find the inner DataSource control and set a SelectParameter for it.
void MyOuterRepeater_ItemDataBound(Object sender, RepeaterItemEventArgs e)
{
// Find the Inner DataSource control in this Row.
SqlDataSource s = (SqlDataSource)e.Item.FindControl("InnerDataSource");
// Set the SelectParameter for this DataSource control
// by re-evaluating the field that is to be passed.
s.SelectParameters["MyParam"].DefaultValue = DataBinder.Eval(e.Item.DataItem, "MyFieldValueToPass").ToString();
}
For an example using the DataList, check out the ASP.NET quickstarts here
P.S.: Please see Tony's reply below for an important correction to the above presented snippet. Notably, it would be essential to check the ItemType of the current RepeaterItem. Alternatively, it's an excellent practice to always check for nulls on every object.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With