2013-05-02 52 views
0

問題

我有一個ButtonColumn編輯這樣定義行:爲什麼這裏DataGridItem的DataItem屬性爲null?

<asp:ButtonColumn DataTextField="job_code" ButtonType="LinkButton" HeaderText="Job Code" 
    CommandName="edit"></asp:ButtonColumn> 

,並在OnItemCommand處理程序DataGrid我有這樣的代碼:

If e.CommandName = "edit" Then 
    Dim o As ListDataModel = CType(e.Item.DataItem, ListDataModel) 
    If o Is Nothing Then 
     Exit Sub 
    End If 

    ... 
End If 

e.Item.DataItemnull這裏。

我已經通過相關問題看起來並驗證了以下內容:

  1. e.ItemItemType設置爲ListItemType.Item,因此應被允許容納DataItem。這也與MSDN documentation jive。
  2. 我利用數據綁定- 見下面的代碼段。
  3. 我已經在asp:DataGrid上設置了DataKeyField屬性,如下所示:DataKeyField="job_code"

數據綁定代碼(發生在搜尋法)

Using reader As SqlDataReader = cmd.ExecuteReader() 
    Dim list As List(Of ListDataModel) = New List(Of ListDataModel) 

    While reader.Read() 
     list.Add(New ListDataModel With 
       { 
        ... 
       }) 
    End While 

    dgSearchResults.DataSource = list 
    dgSearchResults.DataBind() 
End Using 

現在,Search方法是一個input按鈕的onserverclick事件處理程序。該流程將是在用戶搜索結果,然後單擊命令按鈕中的一個編輯的行,因此Search方法不會當OnItemCommand處理器被解僱運行。

+0

'DataItem'總是'Nothing'上回發。 ASP.NET將值存儲在ViewState中(如果啓用)。 – 2013-05-02 14:54:35

+0

@TimSchmelter,所以當用戶點擊編輯ButtonColumn時它永遠不會有值? – 2013-05-02 14:57:48

+0

不,只有在網格是數據綁定的情況下,但您可以使用'CommandArgument'來獲取ID。 – 2013-05-02 15:04:51

回答

0

好了,所以這個決議結束了一個有點令人費解。首先,我最後不得不存儲在Session設置的搜索結果,所以我建立了一個Dictionary

Dim cache As Dictionary(Of String, ListDataModel) = New Dictionary(Of String, ListDataModel) 

,建設ListDataModel對象時添加到Dictionary。然後,在OnItemCommand處理我最後不得不使用Reflection這樣的:

Dim cache As Dictionary(Of String, ListDataModel) = CType(Session("SearchResults"), Dictionary(Of String, ListDataModel)) 
If cache Is Nothing Then 
    Exit Sub 
End If 

Dim prop As PropertyInfo = e.CommandSource.GetType().GetProperty("Text") 
If prop Is Nothing Then 
    Exit Sub 
End If 

Dim o As ListDataModel = cache(prop.GetValue(e.CommandSource, Nothing).ToString()) 
If o Is Nothing Then 
    Exit Sub 
End If 

正如你可以看到我第一次拉着「SearchResult所」出Session,然後試圖獲得在DataGridLinkButtonText財產。我不得不使用Reflection,因爲DataGridLinkButton類不可見。最後,如果我找到了這個房產,我就把價值拉​​下來了。

雖然這工作,我希望我的解決方案是東西,我保持了申請其他怪異的一個副產品,這真的不是我想要的東西到底做。這是一個非常不好的接口與DataGrid - 但它是ASP.NET 2.0,因此它的一些舊的東西!