6

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

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

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

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

4

5 回答 5

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>
于 2014-03-28T11:06:30.017 回答
4

我认为最好的方法是处理 Outer Repeater 的 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 快速入门

PS:请参阅下面托尼的回复,以获取对上述片段的重要更正。值得注意的是,必须检查当前RepeaterItem 的ItemType。或者,始终检查每个对象上的空值是一种极好的做法。

于 2009-01-29T13:23:36.827 回答
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 调用烘焙到转发器的事件处理程序中。

于 2009-01-29T13:47:10.180 回答
3

Cerebrus 的答案有效,但有一个问题。除非您遵循我认为的这个问题的规则,否则您将获得空异常:

在ItemDataBound期间如何访问被数据绑定的项目?

本质上,我必须检查以确保有问题的项目是一个项目或交替项目,否则页眉和页脚会造成麻烦。

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

// 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();
}
于 2009-01-29T14:30:53.710 回答
1

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

Repeater rpt  = (Repeater)e.Item.FindControl("rptNested");
SqlDataSource s = (SqlDataSource)rpt.FindControl("InnerDataSource");
于 2009-01-29T15:42:31.723 回答