我有個 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 屬性