2010-06-04 81 views
1

我想访问处理列表视图的事件,如当被数据绑定到我的列表视图中的数据:ASP ListView:如何访问数据绑定到行的数据?

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") %>' /> 

我的眼睛流血,有没有更好的办法?

回答

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.... 
} 
1

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

e.Item.DataItem 

会给你你要找的对象;你只需要将它转换为你需要的类型。

这个MSDN page有一个更完整的例子。

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

+1

我没有e.Item.DataItem,它不会出现在intellisense上,当我尝试编译它时会导致错误。 – Robert 2010-06-04 14:00:24

+0

@Robert - 你可能不会在ItemCommand事件上获得它,但你应该在ItemDataBound事件中获得它 - 这是我链接到的MSDN页面显示的内容。这不是这种情况吗? – 2010-06-04 14:12:28

+0

不,不能在任何事件上得到它。我发现了一个适用于ItemDataBound方法的解决方法,但即使如此,ItemCommand方法仍然存在问题。我认为这个问题可能是因为我使用的是DataSource而不是ObjectDataSource。 – Robert 2010-06-04 14:40:51

1

只是为了你提到,你不要在ItemDataBoundEvent解决方案扩大不需要通过ListView的DataKeys去访问ItemDataBoundEvent中的数据。将e.Item转换为ListViewDataItem可让您访问DataItem属性,然后您可以将其转换为基础数据类型,从而为您提供对每个基础数据字段的智能访问访问权限。例如: -

(ActualDataType)(((ListViewDataItem)e.Item).DataItem)