我想在处理列表视图事件时访问数据绑定到列表视图的数据,例如:
protected void List_ItemDataBound(object sender, ListViewItemEventArgs e)
或
protected void List_ItemCommand(object sender, ListViewCommandEventArgs e)
在事件内部,我无法通过Eval("ID")
目前我们正在使用非常糟糕的解决方案:
string id = e.Item.FindControl("lblID").Text;
其中lblID
是一个隐藏控件,使用以下命令填充aspx文件中的数据:
<asp:Label ID="lblID" runat="server" Text='<%# Eval("ID") %>' />
当我看到这个时,我的眼睛流血了,有更好的方法吗?
答案 0 :(得分:1)
在事件处理程序中,使用EventArgs对象。
e.Item.DataItem
将为您提供您正在寻找的对象;然后你需要将它转换为你需要的类型。
这个MSDN page有一个更全面的例子。
对于ItemCommand事件处理程序,您可能没有此选项。在这种情况下,我会使用CommandName
的{{1}}和CommandArgument
属性(或者您正在使用的任何属性)。将您的ID作为CommandArgument,然后您可以从事件处理程序中的事件参数对象中选择它。
答案 1 :(得分:1)
经过一些修修补补后,我找到了合适的解决方案:
需要将数据键添加到列表视图中。与数据绑定到列表视图的数据不同,数据键是持久的。要设置数据键,只需在ListView标记中指定名称:
<asp:ListView ID="MyListview" runat="server" DataKeyNames="ID" ......
然后从事件中访问密钥:
protected void MyListView_ItemCommand(object sender, ListViewItemEventArgs e)
{
// Get the item index of the Item
int itemIndex = ((ListViewDataItem)e.Item).DisplayIndex;
// Extract the key and cast it to its data type.
DataKey key = ((ListView)sender).DataKeys[itemIndex];
int myId = (int) key;
// Use ID to delete / modify the item in the SQL database....
}
答案 2 :(得分:1)
为了扩展您提到的ItemDataBoundEvent解决方案,您无需通过ListView的DataKeys访问ItemDataBoundEvent中的数据。通过将e.Item转换为ListViewDataItem,您可以访问DataItem属性,然后可以将其转换为基础数据类型,从而为您提供对每个基础数据字段的智能感知访问。例如: -
(ActualDataType)(((ListViewDataItem)e.Item).DataItem)