1

我需要将两个单独查询的结果显示为同一个 html 表中的并排列。这两个数据集中的每一个都来自通过 ASP.NET SqlDataSource 的存储过程,并且它们各自返回相同数量的行。我希望输出看起来像这样:

 <table>
   <tr>
    <td>Row 1 from Stored Procedure 1</td>
    <td>Row 1 from Stored Procedure 2</td>
   </tr>
   <tr>
    <td>Row 2 from Stored Procedure 1</td>
    <td>Row 2 from Stored Procedure 2</td>
   </tr>
   ...
   <tr>
    <td>Row n from Stored Procedure 1</td>
    <td>Row n from Stored Procedure 2</td>
   </tr>
 </table>

是否可以使用“交替行”功能在单个 ASP 中继器控件中完成此操作?是否可以并排执行两个 ASP 中继器?是否有其他控件可以完成此操作?

4

3 回答 3

1

我不认为这是可能的桌子。

你可以这样做:

<div style="width:500px;float:left;">
    <asp:Repeater ID="Repeater1">
        <div style="width:100%;height:25px;"><asp:Label ID="RowDataLabel"></asp:Label></div>
    </asp:Repeater>
</div>
<div style="width:500px;float:left;">
    <asp:Repeater ID="Repeater2">
        <div style="width:100%;height:25px;"><asp:Label ID="RowDataLabel"></asp:Label></div>
    </asp:Repeater>
</div>

(我知道我缺少一些标记)

这实际上如何呈现将取决于每行中的数据有多少和有多相似。一个非常长的数据可能会影响整个布局。如果你对 css 有问题,你也可以使用<ul>'s 而不是's。<div>

另一种选择是在代码中获取两个数据集,使用 LINQ 组合它们,然后将单个组合数据集呈现到网格或中继器。

于 2013-04-10T23:34:32.700 回答
1

由于两个 DataTable 具有相同的行数,您可以将第一个表设置为数据源并使用e.Item.ItemIndex.

所以这将是你的Repeater标记:

<asp:Repeater ID="rptData" runat="server" OnItemDataBound="rptData_ItemDataBound">
    <HeaderTemplate>
        <table border="1" >
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td><asp:Label ID="lblFirst" runat="server" /></td>
            <td><asp:Label ID="lblSecond" runat="server" /></td>
        </tr>
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

你会这样处理OnItemDataBound

protected void rptData_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        ((Label)e.Item.FindControl("lblFirst")).Text = ((DataRowView)e.Item.DataItem)["Value"].ToString();
        ((Label)e.Item.FindControl("lblSecond")).Text = this.dtSecond.Rows[e.Item.ItemIndex]["Value"].ToString();
    }
}

这是其余的代码隐藏,所以你有一个完整的工作示例:

//PAGE-LEVEL VARIABLES
DataTable dtFirst = new DataTable();
DataTable dtSecond = new DataTable();

protected void Page_Load(object sender, EventArgs e)
{
    this.PopulateDatasources();
    this.rptData.DataSource = this.dtFirst;
    this.rptData.DataBind();
}

private void PopulateDatasources()
{
    DataRow row = null;
    dtFirst.Columns.Add(new DataColumn("Value"));
    dtSecond.Columns.Add(new DataColumn("Value"));
    row = dtFirst.NewRow();
    row["Value"] = "First - 01";
    dtFirst.Rows.Add(row);
    row = dtFirst.NewRow();
    row["Value"] = "First - 02";
    dtFirst.Rows.Add(row);
    row = dtSecond.NewRow();
    row["Value"] = "Second - 01";
    dtSecond.Rows.Add(row);
    row = dtSecond.NewRow();
    row["Value"] = "Second - 02";
    dtSecond.Rows.Add(row);
}

让我知道这是否适合您。

于 2013-04-11T15:20:31.520 回答
0

你有任何专栏可以加入他们吗?如果是,您可以做的是使用 DataRelation 连接 DataSet 上的表,并且在页面中您可以使用此关系获取子级或父级,如下示例

后面的代码:

    protected void Page_Load(object sender, EventArgs e)
{
    DataSet ds1 = new DataSet();
    DataSet ds2 = new DataSet();

    DataTable dt1 = new DataTable("Table1");
    DataTable dt2 = new DataTable("Table2");

    DataSet ds = new DataSet("DataSet");

    dt1.Columns.Add("Eno", typeof(Int32));
    dt1.Columns.Add("Ename", typeof(String));
    dt1.Columns.Add("Salary", typeof(Double));
    dt1.Columns.Add("Deptno", typeof(Int32));
    dt1.PrimaryKey = new DataColumn[] { dt1.Columns["Eno"] };

    dt2.Columns.Add("Deptno", typeof(Int32));
    dt2.Columns.Add("Dname", typeof(String));
    dt2.PrimaryKey = new DataColumn[] { dt2.Columns["Deptno"] };

    ds1.Tables.Add(dt1);
    ds2.Tables.Add(dt2);

    // Loading data into dt1, dt2:

    object[] o1 = { 1, "dvs.kiran kumar", 50000.50, 10 };
    object[] o2 = { 2, "Raj", 4000.50, 20 };
    object[] o3 = { 3, "Gary", 10000.50, 30 };

    object[] c1 = { 10, "MFG" };
    object[] c2 = { 20, "EAS" };
    object[] c3 = { 30, "E&U" };
    object[] c4 = { 40, "PES" };

    dt2.Rows.Add(c1);
    dt2.Rows.Add(c2);
    dt2.Rows.Add(c3);
    dt2.Rows.Add(c4);

    dt1.Rows.Add(o1);
    dt1.Rows.Add(o2);
    dt1.Rows.Add(o3);

    DataSet dsJoined = new DataSet();
    dsJoined.Tables.Add(ds1.Tables[0].Copy());
    dsJoined.Tables.Add(ds2.Tables[0].Copy());
    DataRelation drel = new DataRelation("EquiJoin", dsJoined.Tables[1].Columns["Deptno"], dsJoined.Tables[0].Columns["Deptno"]);
    dsJoined.Relations.Add(drel);

    rptJoined.DataSource = dsJoined.Tables[1];
    rptJoined.DataBind();


}

标记:

        <asp:Repeater runat="server" ID="rptJoined">
        <HeaderTemplate>
            <table>
        </HeaderTemplate>
        <ItemTemplate>

            <tr>
                <td>
            Depto: <%# ((System.Data.DataRowView) Container.DataItem)["Dname"] %>
                </td>
            <asp:Repeater runat="server" ID="rptChild" DataSource='<%# ((System.Data.DataRowView) Container.DataItem).Row.GetChildRows("EquiJoin") %>'>
                <ItemTemplate>
                    <td>
                Ename: <%# ((System.Data.DataRow) Container.DataItem)["Ename"] %>
                    </td>
                </ItemTemplate>
            </asp:Repeater>
            <tr>

        </ItemTemplate>
        <FooterTemplate>
            </table>
        </FooterTemplate>
    </asp:Repeater>

另一种选择是使用中继器中的 OnItemDataBound 事件并获取后面代码中的值。

后面的代码:

    protected void rptJoined_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {

        DataRowView drv = (DataRowView)e.Item.DataItem;

        Literal ltrColumn1 = (Literal)e.Item.FindControl("ltrColumn1");
        Literal ltrColumn2 = (Literal)e.Item.FindControl("ltrColumn2");

        ltrColumn1.Text = drv["Dname"].ToString();

        var childs = drv.Row.GetChildRows("EquiJoin");

        if (childs.Count() > 0)
        {
            ltrColumn2.Text = childs[0]["Ename"].ToString();
        }
    }
}

标记:

<asp:Repeater runat="server" ID="rptJoined" OnItemDataBound="rptJoined_ItemDataBound">
        <HeaderTemplate>
            <table>
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
                <td>
                    <asp:Literal runat="server" ID="ltrColumn1" />
                </td>
                <td>
                    <asp:Literal runat="server" ID="ltrColumn2" />
                </td>
            <tr>
        </ItemTemplate>
        <FooterTemplate>
            </table>
        </FooterTemplate>
    </asp:Repeater>

干杯

于 2013-04-11T00:24:30.583 回答