雖然通過一些代碼去,我發現那裏是這樣寫的:請解釋下面的代碼?
ListViewDataItem dataItem = (ListViewDataItem)(((ImageButton)sender).Parent.Parent);
int noteId = Convert.ToInt32(((HiddenField)dataItem.FindControl("hidNoteId")).Value);
請解釋這兩條線段的意義。
雖然通過一些代碼去,我發現那裏是這樣寫的:請解釋下面的代碼?
ListViewDataItem dataItem = (ListViewDataItem)(((ImageButton)sender).Parent.Parent);
int noteId = Convert.ToInt32(((HiddenField)dataItem.FindControl("hidNoteId")).Value);
請解釋這兩條線段的意義。
當項目綁定到網格/中繼器時,使用按鈕作爲後控制,需要一種方法來確定哪一行正在執行。上面的所有代碼都在導航控件並從行中的一組值中提取值。
有一個控件(鍵入隱藏字段),用於跟蹤ListView中項目的標識(http://msdn.microsoft.com/en-us/library/bb398790.aspx)
它是不應寫入的代碼,IMO。這是低效和脆弱的。此外,該項目的標識以純文本形式存儲在頁面的源文件中。
此代碼似乎獲得單擊按鈕時的數據綁定項目的身份。一種更好的方式是簡單地設置的按鈕的命令的參數,如下所示:
<asp:ImageButton runat="server" CommandArgument="[Binding Expression]" />
在按鈕的事件處理程序,所述CommandArgument可以檢索並轉換爲Int32。用這種方法,你甚至不需要那個隱藏的領域。
首先,這兩條線在使用括號和鑄造時似乎有點瘋狂。可能有更好的方法來做他們正在做的事情,但沒有更多的代碼很難提供任何建議。
無論如何,第一行將出現在由ImageButton
引發的事件的事件處理程序中。事件處理程序方法將有一個sender
參數;這正在被投入到ImageButton
。然後在此ImageButton上調用Parent.Parent
;這會使對象在控制層面上有兩個層次。開發者顯然確信這是一個ListViewDataItem
,所以它被投射到其中之一。因此變量dataItem
現在包含一個ListViewDataItem
的實例。
在第二行中,在dataItem
上調用FindControl
方法。據推測,這個ListViewDataItem
下的控件的ID爲「hidNoteId」。 FindControl
返回Control
;但開發人員知道這個控制實際上是一個HiddenField
,所以有一個演員。然後將該隱藏字段的Value
屬性傳遞給Convert.ToInt32
方法以給出一個整數 - 然後將其存儲在noteId
變量中。
所以最後,還有一個ListView,其中每個數據項都包含一個隱藏字段,其中包含某個ID的值。此代碼正在獲取ID。
是的,使用CommandArgument是我以前做過的。你只需要確保你處理'Command'事件而不是'Click'事件。然後可以從事件處理程序的CommandEventArgs參數中訪問命令參數。 – 2010-11-19 14:31:06
@Graham - 對,使用CommandArguments有幾個步驟,但通常它會解決這種情況。如果沒有更多的OP代碼,就很難知道是否有其他原因使用了隱藏字段。 – 2010-11-19 14:35:41