﻿# 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 屬性](http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.listviewcommandeventargs.item.aspx)
