0

问题

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

<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. ItemTypeofe.Item设置为,因此ListItemType.Item应该允许容纳DataItem. 这也符合MSDN 文档
  2. 我利用了数据绑定- 请参阅下面的代码部分。
  3. 我已经设置了这样的DataKeyField属性asp:DataGridDataKeyField="job_code".

数据绑定代码(发生在 Search 方法中)

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方法将不会运行。OnItemCommand

4

1 回答 1

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

如您所见,我首先将“SearchResults”从 中提取出来Session,然后尝试获取Text. DataGridLinkButton我不得不使用Reflection,因为DataGridLinkButton该类不可见。最后,如果我找到了房产,我就取消了价值。

虽然这可行,而且我希望我的解决方案是我正在维护的应用程序中其他奇怪事物的副产品,但这真的不是我最终想要做的。这是一个非常糟糕的接口DataGrid-但它是 ASP.NET 2.0,所以它是一些旧的东西!

于 2013-05-02T15:39:33.983 回答