嵌套的Repeater和SqlDataSource参数

Ton*_*son 6 sql sql-server asp.net repeater

我正在使用嵌套转发器构建一个表,原因我不在这里讨论,但我要做的是有两个数据源,一个用于顶级转发器,对应于行,一个用于第二级将在一行内返回单元格的转发器.

然而,我想知道的是,如果我能以某种方式在嵌套转发器的数据源中指定一个参数,该数据源是在第一个数据源的结果中设置了一个字段吗?

我可以将参数设置为数据绑定表达式的值吗?

我想这样做的原因是我有两个存储过程.当页面加载时我有一个会话参数我可以用来运行第一个存储过程,但是,对于第二个存储过程,我需要将顶级转发器的每个实例的值与对第二个存储过程的调用相关联具有不同的参数值.

Ale*_*lor 5

我通过使用 HiddenField 来存储稍后用作参数的值来做到这一点。完成工作。

<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>
Run Code Online (Sandbox Code Playgroud)


Cer*_*rus 4

我认为最好的方法是处理外部中继器的 ItemDataBound 事件,找到内部 DataSource 控件并为其设置 SelectParameter。

    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();
    }
Run Code Online (Sandbox Code Playgroud)

有关使用 DataList 的示例,请查看此处的ASP.NET 快速入门

PS:请参阅下面托尼的回复,了解对上述片段的重要更正。值得注意的是,检查当前 RepeaterItem 的 ItemType 非常重要。或者,始终检查每个对象上的 null 值也是一种很好的做法。