【问题标题】:Gridview inside a repeater ondataitembound grid view rebinding中继器内的 Gridview ondataitembound 网格视图重新绑定
【发布时间】:2013-02-21 20:09:22
【问题描述】:

我有一个中继器,它的 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>

然后在页面加载时,我将包含 20 行的 datatable 绑定到此转发器:

这是我的页面加载代码

    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 次,但这在逻辑上是合理的还是我做错了什么?!

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

【问题讨论】:

  • 如果您将一个表绑定到具有 20 行的中继器,并且每行中都有一个 gridview,那么毫无疑问您将拥有 20 个网格视图。这正是您告诉它的.我想您的网格视图数据需要来自另一个变量。你究竟期望会发生什么?期望的结果是什么?
  • 我想将一个数据集绑定到转发器,这样我就可以拥有这个数据集中的表格数量的网格视图,我应该在数据绑定中做什么,@Pow-Ian 是可能的
  • 我明白了,所以您不是根据数据集中的表数进行绑定,而是希望在包含数据集中每个表的数据的每一行中绑定一个 gridview。那么,您的问题中的措辞是错误的。是的,这是可能的。
  • 不,我只是用一个例子来解释,正如我所期望的,当我使用数据集时,网格视图的结果将是第 X 行表。这不是什么逻辑......你能解释一下我如何将数据集绑定到网格视图并让网格视图带有表格编号

标签: asp.net data-binding gridview dataset repeater


【解决方案1】:

更改这行代码:

rep.DataSource = ds;

到这里:

rep.DataSource = ds.Tables;

【讨论】:

    【解决方案2】:

    您可以将转发器与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 对象。

    【讨论】:

    • 感谢您的建议,但它仍然没有正确绑定表,我已经完成了以下操作并且仍然返回 20 行.. 这是对 gridview 语句 grdVw.DataSource = ((DataRowView)e. Item.DataItem).DataView.Table;
    • 您目前正在绑定什么?数据集还是表格?
    • 我已经将一个数据集绑定到转发器并且该数据集有 10 个表,预期结果是 10 个网格视图而不是 20 个网格视图
    • 你在哪里绑定中继器?在我看来它被绑定了两次。
    • btw ((Datatable)e.Item.DataItem).Rows;引发以下异常Unable to cast object of type 'System.Data.DataRowView' to type 'System.Data.DataTable'。所以我投射到 datarowview 并且它运行无异常但没有按预期运行
    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2011-09-07
    • 2016-03-15
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    相关资源
    最近更新 更多