为什么此DataGridItem的DataItem属性为null?

时间:2013-05-02 14:49:56

标签: asp.net .net vb.net asp.net-2.0

问题

我有一个ButtonColumn来编辑这样定义的行:

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

并在OnItemCommand的{​​{1}}处理程序中,我有以下代码:

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.DataItem

我查看了相关问题并验证了以下内容:

  1. null的{​​{1}}设置为ItemType,因此应该允许e.Item。这也与MSDN documentation
  2. 相符
  3. 我利用数据绑定 - 请参阅下面的代码部分。
  4. 我在ListItemType.Item上设置了DataItem属性,如下所示:DataKeyField
  5. 数据绑定代码(在搜索方法中发生)

    asp:DataGrid

    现在,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事件处理程序。该流程将供用户搜索结果,然后单击其中一个命令按钮来编辑行,因此当onserverclick处理程序为input时,Search方法将不会运行烧成。

1 个答案:

答案 0 :(得分:0)

好吧,所以这个问题的解决方案有点令人费解。首先,我最终必须将搜索结果集存储在Session中,因此我为此构建了Dictionary

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

并在构建Dictionary对象时添加到ListDataModel。然后,在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

正如您所看到的,我首先从Session中删除了“SearchResults”,然后尝试获取Text的{​​{1}}属性。我不得不使用DataGridLinkButton,因为Reflection类不可见。最后,如果我找到了这个属性,我就取消了这个值。

虽然这有效,但我希望我的解决方案是我正在维护的应用程序中的其他奇怪的副产品,但它最终并不是我想要做的。这是DataGridLinkButton - 的一个非常差的界面,但它是ASP.NET 2.0,所以它是一些旧东西!