2010-06-04 71 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)