0

我有一个中继器,它有一个 asp gridview 如下:

 <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>

然后在页面加载时,我将datatable包含 20 行的 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 次,但这在逻辑上是合理的还是我做错了什么?!

我可以很容易地有一个标志来确保数据只绑定到表一次,但是如果我已经将数据集绑定到转发器怎么办?如何处理与网格视图的绑定?

4

2 回答 2

3

更改这行代码:

rep.DataSource = ds;

对此:

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

您可以将转发器与 a 绑定,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,因此请确保您绑定了行对象。

于 2013-03-06T21:07:42.317 回答