嵌套的Repeater和SqlDataSource参数

时间:2009-01-29 13:12:52

标签: asp.net sql sql-server repeater

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

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

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

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

5 个答案:

答案 0 :(得分: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();
    }

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

P.S。:请参阅下面的Tony的回复,对上面提到的代码段进行重要修正。值得注意的是,检查当前RepeaterItem的ItemType是很重要的。或者,始终检查每个对象上的空值是一种很好的做法。

答案 1 :(得分:4)

我是通过使用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>

答案 2 :(得分:3)

您可能希望研究一种可以减少sproc调用量的技术。可以从同一存储过程返回多个结果集。 .net数据集能够定义多个数据表之间的关系,从而可以轻松地在一个表中获取数据行,并将所有子节点放在另一个数据表中。例如:

exampleData.Relations.Add(New DataRelation("FOO_RELATION", exampleData.Tables["TABLE_A"].Columns["ID"], exampleData.Tables["TABLE_B"].Columns["PARENT_ID"]));

然后,从TABLE_A中的任何数据行,您都可以访问所有这些子项:

DataRow[] childRows = row.GetChildRows("FOO_RELATION");

这更有效,恕我直言也更容易。这样,您就不需要将sproc调用烘焙到转发器的事件处理程序中。

答案 3 :(得分:3)

Cerebrus的回答是有效的,只有一个捕获。除非您遵循我认为的这个问题的规则,否则您将获得null异常:

How to access the item being data bound during ItemDataBound?

基本上,我必须检查以确保相关项目是项目或交替项目,否则页眉和页脚将导致麻烦。

编辑:尝试使用FindControl获取DataSource时出错。 FindControl返回null,所以当我去访问数据源时,我得到了第二个null异常。所以我最终只是直接访问对象。无论如何,数据源都在设计器文件中声明。所以有了这个,我终于让嵌套的中继器工作了。

// Find the Inner DataSource control in this Row.

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == 
    ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.EditItem)
{
    CellsDataSource.SelectParameters["testRunID"].DefaultValue = 
        DataBinder.Eval(e.Item.DataItem, "TestRunID").ToString();
}

答案 4 :(得分:1)

我认为对FindControl的调用返回null,因为你必须首先在嵌套的转发器上调用FindControl 然后在返回的转发器上调用FindControl。

Repeater rpt  = (Repeater)e.Item.FindControl("rptNested");
SqlDataSource s = (SqlDataSource)rpt.FindControl("InnerDataSource");