【问题标题】:VB.NET: How to call another stored procedures based on stored procedure result and display all results?VB.NET:如何根据存储过程结果调用另一个存储过程并显示所有结果?
【发布时间】:2015-12-21 00:05:39
【问题描述】:

我有一个场景,我的存储过程 (sp1) 从网页获取输入并返回一些结果。例如,如果 sp1 返回 10 条记录,我们在每条记录中都有“id”列,我们需要将该“id”列值传递给另外两个存储过程(例如:sp2、sp3)并显示所有结果(来自 sp1、 sp2, sp3) 关联到页面开头的记录 1 和记录 2 之后的所有详细信息等等..

网页上的输出应如下所示:

Record1 details 

Sp2 Output(record1)

sp3 Output(record1)

Record2 details 

Sp2 Output(record2)

sp3 Output(record2)
Record3 details 

Sp2 Output(record3)

sp3 Output(record3)

...........

谁能告诉我如何以这种方式呈现。 Sp1 结果在一个数组列表中(在后面的代码中),而 sp2 和 sp3 从字面上返回表(大约 10 个包含 5-6 列的记录)。

我只需要如何显示数据.. 我使用 for each 为 sp1 结果中的每条记录执行 sp2 和 sp3。想知道如何将数据存储在代码后面以及如何在 aspx.page 上显示..

【问题讨论】:

  • 您是否需要仅显示数据方面的帮助,还是需要完全了解如何执行存储过程?
  • 我只需要如何显示数据。我使用for each 为sp1 结果中的每条记录执行sp2 和sp3。想知道如何将数据存储在代码后面以及如何在 aspx.page 上显示。 @NoAlias

标签: c# asp.net vb.net datatable dataset


【解决方案1】:

这将是使用Repeater 类的理想选择。您可以嵌套它们以处理基于初始 DataSource 显示数据的逻辑。由于我不知道您的模型定义,因此我使用了您需要在示例代码中替换的通用占位符。这些占位符的示例包括“SomeFieldFromSp2DataTable”、“FieldNameOfId”、“TheClassOfItemsInYourArrayList”等。

首先,在 ASPX 页面中进行标记。 HeaderTemplate 包含用于数据源标头的标记。 ItemTemplate 是 DataSource 中每个项目正文的标记。 FooterTemplate 在数据源的末尾做标记。在本例中,我对其进行了模拟,以便创建嵌套的 HTML 表。

<asp:Repeater ID="rptSP1" runat="server">
    <HeaderTemplate>    
        <table>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td><asp:Label ID="lblSP1" runat="server"><%# CType(Container.DataItem, TheClassOfItemsInYourArrayList).FieldNameOfId%></asp:Label></td>
        </tr>
        <asp:Repeater ID="rptSP2" runat="server">
            <HeaderTemplate>
                <tr><td><table>
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td><asp:Label ID="lblSP2" runat="server"><%#DataBinder.Eval(Container.DataItem, "SomeFieldFromSp2DataTable")%></asp:Label></td>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table></td></tr>
            </FooterTemplate>
        </asp:Repeater>
        <asp:Repeater ID="rptSP3" runat="server">
            <HeaderTemplate>
                <tr><td><table>
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td><asp:Label ID="lblSP3" runat="server"><%#DataBinder.Eval(Container.DataItem, "SomeFieldFromSp3DataTable")%></asp:Label></td>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table></td></tr>
            </FooterTemplate>
        </asp:Repeater>         
    </ItemTemplate>
    </FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

请注意,访问 ArrayList 值与 DataTable 或更典型的 List(of T) 略有不同。

接下来,您需要为父中继器连接初始 DataSource 绑定:

rptSP1.DataSource = YourArrayList
rptSP1.DataBind()

你还没有完成。您现在必须确保从第一个中继器获取数据,以便为第二个和第三个中继器获取数据源。您可以在 rptSP1 的 ItemDataBound 事件的事件处理程序中完成此操作。由于嵌套的中继器位于 ItemTemplate 中,您必须使用 FindControl 并将它们转换为中继器。

Private Sub rptSP1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptSP1.ItemDataBound

    'Perform this check because you only need the actual data items.
    If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then

        Dim intIdFromSp1 As Integer = CType(e.Item.DataItem, TheClassOfItemsInYourArrayList).IdField

        Dim rptSP2 As Repeater = CType(e.Item.FindControl("rptSP2"), Repeater)
        Dim rptSP3 As Repeater = CType(e.Item.FindControl("rptSP3"), Repeater)

        'Code that gets the data from the other SPs would be in a Function called GetDataTableFromSP2.
        rptSP2.DataSource = GetDataTableFromSP2(intIdFromSp1)
        rptSP2.DataBind()

        rptSP3.DataSource = GetDataTableFromSP3(intIdFromSp1)
        rptSP3.DataBind()

    End If

End Sub

【讨论】:

  • 感谢您的回答.. 我面临一个小问题... Repetor2 和中继器 3 可在代码隐藏文件中访问...当我们尝试使用 repeter2&3 时会抛出错误在文件后面的代码中......请有任何建议
  • 我编辑了答案以包括使用 FindControl 和 Casting 作为中继器的重要步骤。
猜你喜欢
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多