0

次のようにaspグリッドビューを持つリピーターがあります:

 <asp:Repeater ID="rep" runat="server" OnItemDataBound="rep_ItemDataBound">
     <ItemTemplate>   
         <asp:GridView ID="grdVw" runat="server" AutoGenerateColumns="False">
             <Columns>  
                 <asp:BoundField DataField="Link" HeaderText="Link" />
             </Columns>
         </asp:GridView>
     </ItemTemplate>
 </asp:Repeater>

次に、ページの読み込み時に、datatable20 行を含む a をこのリピーターにバインドします。

これは私のページ読み込みコードです

    protected void Page_Load(object sender, EventArgs e){
   //dummy code for testing
            table.Columns.Add("Name");
            table.Columns.Add("Link");

            DataRow row ;
            for (int i = 0; i <20; i++) 
            {
                row = table.NewRow();
                row[0] = "dsadsd";
                row[1] = "text";

                table.Rows.Add(row);
            }

            for (int i = 0; i < 10; i++)
            {
                ds.Tables.Add(table.Copy());
            }
               rep.DataSource = ds;
                rep.DataBind();
}

次に、リピーターを次のItemDataBoundeventように処理します。

protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item)
        {
            GridView grdVw = e.Item.FindControl("grdVw") as GridView;
            grdVw.DataSource = table;
            grdVw.DataBind();
        }
    }

驚くべきことに、結果は 20 のグリッドビューです!! ItemDataBoundこれは、 の各行で が発生するためだと考えていtableます。したがって、このハンドラー イベントではテーブルを 20 回バインドしますが、これは論理的に正しいのでしょうか、それとも何か間違ったことをしているのでしょうか?!

データがテーブルに 1 回だけバインドされていることを確認するフラグを簡単に設定できますが、データセットをリピーターにバインドした場合はどうなるでしょうか。グリッド ビューへのこのバインドを処理するにはどうすればよいですか?

4

2 に答える 2

3

次のコード行を変更します。

rep.DataSource = ds;

これに:

rep.DataSource = ds.Tables;
于 2013-03-07T00:36:21.057 に答える
1

リピーターをとバインドすることはできdatasetますが、そのセット内のテーブルの処理方法に注意する必要があります。

これ:

rep.DataSource = table;
rep.DataBind();

する必要があります:

rep.DataSource = {Some Dataset with more than one table};
rep.DataBind();

次に、ハンドラーで:

protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item)
    {
        GridView grdVw = e.Item.FindControl("grdVw") as GridView;
        //EDIT: my vb was showing.
        grdVw.DataSource = ((DataTable)e.Item.DataItem).Rows;
        grdVw.DataBind();
    }
}

これはテストされていませんが、少し手を加えることで機能するはずです。知っておく必要があるのは、リピーター内で、テーブルへの参照を取得するために、listItemのdataItemを参照する必要があるということです。また、テーブルはiEnumerableではないため、rowsオブジェクトをバインドしていることを確認してください。

于 2013-03-06T21:07:42.317 に答える