2010-11-19 99 views
0

雖然通過一些代碼去,我發現那裏是這樣寫的:請解釋下面的代碼?

ListViewDataItem dataItem = (ListViewDataItem)(((ImageButton)sender).Parent.Parent); 

int noteId = Convert.ToInt32(((HiddenField)dataItem.FindControl("hidNoteId")).Value); 

請解釋這兩條線段的意義。

回答

1
  1. dataItem是一個綁定控件,當它被單擊時用於表示佔位符。這用於標識控件中正在執行的行。
  2. 通過查找此控件的父項的父項,它爲代碼提供了一個起點以導航到正確的行以從中提取值。
  3. 找到該行後,將爲noteId分配一個隱藏值並將其轉換爲整數。

當項目綁定到網格/中繼器時,使用按鈕作爲後控制,需要一種方法來確定哪一行正在執行。上面的所有代碼都在導航控件並從行中的一組值中提取值。

4

有一個控件(鍵入隱藏字段),用於跟蹤ListView中項目的標識(http://msdn.microsoft.com/en-us/library/bb398790.aspx)

它是不應寫入的代碼,IMO。這是低效和脆弱的。此外,該項目的標識以純文本形式存儲在頁面的源文件中。

此代碼似乎獲得單擊按鈕時的數據綁定項目的身份。一種更好的方式是簡單地設置的按鈕的命令的參數,如下所示:

<asp:ImageButton runat="server" CommandArgument="[Binding Expression]" /> 

在按鈕的事件處理程序,所述CommandArgument可以檢索並轉換爲Int32。用這種方法,你甚至不需要那個隱藏的領域。

+1

是的,使用CommandArgument是我以前做過的。你只需要確保你處理'Command'事件而不是'Click'事件。然後可以從事件處理程序的CommandEventArgs參數中訪問命令參數。 – 2010-11-19 14:31:06

+0

@Graham - 對,使用CommandArguments有幾個步驟,但通常它會解決這種情況。如果沒有更多的OP代碼,就很難知道是否有其他原因使用了隱藏字段。 – 2010-11-19 14:35:41

3

首先,這兩條線在使用括號和鑄造時似乎有點瘋狂。可能有更好的方法來做他們正在做的事情,但沒有更多的代碼很難提供任何建議。

無論如何,第一行將出現在由ImageButton引發的事件的事件處理程序中。事件處理程序方法將有一個sender參數;這正在被投入到ImageButton。然後在此ImageButton上調用Parent.Parent;這會使對象在控制層面上有兩個層次。開發者顯然確信這是一個ListViewDataItem,所以它被投射到其中之一。因此變量dataItem現在包含一個ListViewDataItem的實例。

在第二行中,在dataItem上調用FindControl方法。據推測,這個ListViewDataItem下的控件的ID爲「hidNoteId」。 FindControl返回Control;但開發人員知道這個控制實際上是一個HiddenField,所以有一個演員。然後將該隱藏字段的Value屬性傳遞給Convert.ToInt32方法以給出一個整數 - 然後將其存儲在noteId變量中。

所以最後,還有一個ListView,其中每個數據項都包含一個隱藏字段,其中包含某個ID的值。此代碼正在獲取ID。