我有一个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
。
我查看了相关问题并验证了以下内容:
null
的{{1}}设置为ItemType
,因此应该允许e.Item
。这也与MSDN documentation。ListItemType.Item
上设置了DataItem
属性,如下所示:DataKeyField
。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
方法将不会运行烧成。
答案 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,所以它是一些旧东西!