The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

ListView 的 ItemCommand 事件中如何找到是第幾列執行的

我有個 ListView 並寫了一個 ItemCommand 事件,這個事件是自訂的,但我希望執行完自訂的 Command 後可以修改 ListView 的 SelectedIndex 屬性,讓該列直接被選中,不過我為了找到到底是哪一列執行這個 Command 花了我一個小時才解出來,因為網路上也很難找到相關的資料(主要是不知道應該怎麼查),MSDN 也沒有相關範例。

我最後的解決方式是這樣,如下程式碼:

protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e) {
    if (e.Item.ItemType == ListViewItemType.DataItem) {
        // do something
        ListViewDataItem thisDataItem = 
            (ListViewDataItem)((Button)e.CommandSource).NamingContainer;
        for (int i = 0; i < ListView1.Items.Count; i++) {
            if (ListView1.Items[i].Equals(thisDataItem)) {
                ListView1.SelectedIndex = i; ListView1.DataBind(); break;
            }
        }
    }
}

2008-05-21 更新:

因為 Joe 提示了一個更棒的方法,就是將 ItemCommand 事件中的 e.Item 轉型成 ListViewDataItem 型別,然後把 DisplayIndex 屬性取出即可,最後的寫法如下(只剩下兩���):

ListView1.SelectedIndex = ((ListViewDataItem)e.Item).DisplayIndex;
ListView1.DataBind();

這樣的一個念頭曾經在我腦海中出現過,不過我想說在之前常用的 GridView 有個 GridViewRow 屬性,但 GridViewRow 是無法轉成 DataItem 的,所以連帶的想說 ListView 應該是沒辦法,但沒想到 ListViewItem 物件(e.Item) 竟然可以轉型成 ListViewDataItem 來用。這又再次證明以前學的知識到現在不一定有用,保持大腦的活性真的很重要,不斷的求新求變才是王道。

另外,我也找到了 MSDN 上相關的文章範例:ListViewCommandEventArgs.Item 屬性