1

我想在处理列表视图事件时访问数据绑定到我的列表视图的数据,例如:

protected void List_ItemDataBound(object sender, ListViewItemEventArgs e)

或者

protected void List_ItemCommand(object sender, ListViewCommandEventArgs e)

在事件内部,我无法通过类似的方式访问数据Eval("ID")

目前我们正在使用一个非常hacky的解决方案:

string id = e.Item.FindControl("lblID").Text;

lblID使用 aspx 文件中的数据填充的隐藏控件在哪里:

<asp:Label ID="lblID" runat="server" Text='<%# Eval("ID") %>' />

看到这个我眼睛都流血了,有没有更好的办法?

4

3 回答 3

1

在您的事件处理程序中,使用 EventArgs 对象。

e.Item.DataItem

会给你你正在寻找的对象;然后,您只需要将其转换为您需要的类型。

这个MSDN 页面有一个更完整的示例。

对于 ItemCommand 事件处理程序,您可能没有此选项。在这种情况下,我将使用(或您正在使用的任何内容)的CommandNameandCommandArgument属性。LinkButton将您的 ID 作为 CommandArgument,然后您可以从事件处理程序中的事件参数对象中获取它。

于 2010-06-04T13:40:48.413 回答
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....
}
于 2010-06-04T14:46:32.563 回答
1

只是为了扩展您提到的 ItemDataBoundEvent 解决方案,您不需要通过 ListView 的 DataKeys 来访问 ItemDataBoundEvent 中的数据。将 e.Item 转换为 ListViewDataItem 可让您访问 DataItem 属性,然后您可以将其转换为基础数据类型,从而使您可以智能感知访问每个基础数据字段。例子:-

(ActualDataType)(((ListViewDataItem)e.Item).DataItem)
于 2012-08-01T08:45:29.237 回答