2013-03-06 40 views
0

我已經具有一個asp gridview的如下一個中繼器:的GridView內的中繼器ondataitembound網格視圖重新綁定

<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行到這個中繼器:

這是我的網頁加載代碼

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 gridviews!我想這是因爲ItemDataBoundtable的每一行發生。所以在這個處理程序事件中,我將表綁定了20次,但這是否合乎邏輯或我做錯了什麼?

我可以很容易地有一個標誌,以確保數據已綁定到表只有一次,但如果我已經綁定數據集到中繼器?我如何處理對網格視圖的綁定?

+1

如果你綁定一個表有20行中繼器,每一行中有一個GridView,那麼你毫無疑問會有20個網格視圖。這正是你所說的。我想你的gridviews數據需要來自另一個變量。你期望發生什麼?期望的結果是什麼? – 2013-03-06 20:44:43

+0

我想綁定一個數據集到中繼器,所以我可以使用這個數據集中表格的數量來表示gridviews,我應該怎麼做數據綁定,@ Pow-Ian是我可以看到的 – user690069 2013-03-06 20:47:01

+0

,所以你不是基於數據集中表的數量,您想要在包含數據集中每個表的數據的每一行中綁定gridview。那麼你的問題在你的問題上是錯誤的。對的,這是可能的。 – 2013-03-06 20:59:46

回答

3

更改這行代碼:

rep.DataSource = ds; 

這樣:

rep.DataSource = ds.Tables; 
+0

謝謝它解決了我的問題:) – user690069 2013-03-07 08:24:05

+0

yep應該這樣做。 – 2013-03-07 11:03:55

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,因此請確保您綁定了行對象。

+0

感謝您的建議,但它仍然沒有正確綁定表,我做了以下,仍然返回20行。 。這是綁定到gridview語句 grdVw.DataSource =((DataRowView)e.Item.DataItem).DataView.Table; – user690069 2013-03-06 21:23:58

+0

你目前有什麼約束?一個數據集或表? – 2013-03-06 21:27:38

+0

我已經綁定了一個數據集到中繼器,數據集有10個表格,預期的結果是10個gridviews而不是20個gridviews – user690069 2013-03-06 21:28:58