1

2 つの個別のクエリの結果を、同じ html テーブルの横に並べた列として表示する必要があります。2 つのデータ セットはそれぞれ、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 Repeater コントロール内でこれを達成することは可能ですか? 2 つの ASP Repeater を並べて実行することはできますか? これを達成できる別のコントロールはありますか?

4

3 に答える 3

1

両方の DataTable の行数が同じであるため、最初のテーブルをデータソースとして設定し、 を使用して 2 番目のテーブルの値にアクセスできます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 に答える
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>

(私はいくつかのマークアップが欠けていることを知っています)

これが実際にどのようにレンダリングされるかは、各行のデータがどれだけ類似しているかによって異なります.1 つの非常に長いデータがレイアウト全体を台無しにする可能性があります。CSS に問題がある場合は<ul>、 の代わりに を使用することもできます。<div>

もう 1 つのオプションは、コードで 2 つのデータセットを取得し、LINQ を使用してそれらを結合し、結合された 1 つのデータセットをグリッドまたはリピーターにレンダリングすることです。

于 2013-04-10T23:34:32.700 に答える
0

それらに参加できるコラムはありますか?はいの場合、例に従って、DataSet のテーブルを DataRelation で結合し、ページ内でこの関係を使用して子または親を取得できます。

コードビハインド:

    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>

もう 1 つのオプションは、リピーターからの 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 に答える