ASP ListView:如何访问数据绑定到行的数据?

时间:2010-06-04 12:48:11

标签: asp.net listview listviewitem data-binding

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

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") %>' />
当我看到这个时,我的眼睛流血了,有更好的方法吗?

3 个答案:

答案 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)