2008-11-10 75 views
6

在ASP.NET頁面上,我有一個GridView填充了LINQ查詢的結果。我在代碼中設置DataSource,然後調用DataBind。在GridView的RowDataBound事件中,我根據查詢結果選擇性地隱藏某些GridView字段中的鏈接。 (例如,我隱藏有問題的行的「顯示父項」鏈接沒有父行。)GridView RowDataBound在回發時不觸發

這個工作正常。但在回發(當我調用DataBind,但GridView保持填充通過ViewState),數據顯示,但RowDataBound事件(顯然)不會觸發,我的鏈接不會隱藏。

什麼是回傳後隱藏鏈接的最佳方式?

+0

你在ajax UpdatePanel中有網格嗎?這可能會趕上回傳。 – 2008-11-11 21:14:21

+0

不,在這個特定的頁面上沒有UpdatePanels。 – 2008-11-11 21:22:15

回答

2

以下是我結束瞭解決這個:

  1. 我創建了一個序列化的類與只讀屬性:一個排的PK,並表示無論是啓用或不爲每個鏈接一個布爾值。我們將其稱爲LinkVisibility
  2. 我創建了一個繼承自KeyedCollection的可序列化類來保存上面類的實例。
  3. 我創建了一個持有該集合實例的ViewState支持的屬性。
  4. 在我的搜索過程中(填充GridView),我清除集合。
  5. 在最初顯示/隱藏鏈接的RowDataBound中,我將一個LinkVisibility實例添加到每個行的集合中。
  6. 在Page.Load中,當IsPostBack爲true時,我通過GridView行循環。我通過集合中的PK(DataKeyNames在GridView中設置)查找每個對象的LinkVisibility,然後我相應地設置鏈接。

我不知道這是做到這一點的最佳方式,但它確實有效,這比我嘗試過的其他任何事情都能說得更多。

0

我會期待視圖狀態也反映了你已經刪除了一些鏈接的事實(假設它們在viewstate被保存之前被刪除了)。

也許這就是你需要問的問題'爲什麼刪除的鏈接仍然出現在視圖狀態?'。

1

1)您可以在Grid_DataBound(...)上調用一次Method - ProcessDataRows()。然後在PostBack後需要它時。

這樣你就可以在你想要的時候處理所有的行。

2)你可以有像ShowParentLink()這樣的方法。這隨後綁定到LinkBut​​ton的網格中(如果你使用一個ItemTemplate)與線路將有

Visible='<%#ShowParentLink()%>' 
0

一個頁面,除非它被重建正是因爲它是以前無法處理回發事件(回發)。如果您在page-init期間重新隱藏鏈接,則會觸發點擊事件等。不幸的是,沒有看到一些示例代碼,我不能得到更具體的。

此外,數據RowDataBound不會觸發,因爲您不是數據綁定。您正在從視圖狀態 - 「視圖狀態綁定」重建頁面,因爲缺乏更好的單詞。

0

另一種解決方案是將邏輯放入LINQ查詢中,以便最終生成一個像「ShowParentLink」這樣的布爾LINQ字段。然後,您可以將HyperLink字段的Visible屬性綁定到該值 - 不需要RowDataBound。

0
void Process Rows() 
{ 
    ... do something 
    ... process complete 
    datagrid.DataBind(); 
} 
2

RowDataBound事件僅在GridView數據在回發期間發生更改時觸發。該事件對於速度而言是短路的,因此它不會不必要地重新生成完全相同的數據。使用RowCreated事件來處理HTML,而不管數據是否發生變化,它會在每次回發時觸發。

0
protected void btnHazardRating_Click(object sender, EventArgs e) 
{ 
    gvPanelRole.RowDataBound += new GridViewRowEventHandler(gvPanelRole_RowDataBound); 

    gvPanelRole.DataSource = dtGo; 
    gvPanelRole.DataBind(); 
    ModalPopup.Show(); 

} 
相關問題