2014-01-24 48 views
5

我一直在尋找大約一個小時,並且找不到最佳解決方案。 我正在從VB.NET遷移到C#Forms和C#WPF。 沒關係...... 所以我用這個代碼爲C#的形式和它的工作原理,但不是在C#WPF獲取在ListView中選擇的物品的索引

if (ListView1.SelectedItems.Count > 0) 
      { 
       for (lcount = 0; lcount <= ListView1.Items.Count - 1; lcount++) 
       { 
        if (ListView1.Items[lcount].Selected == true) 
        { 
         var2 = lcount; 
         break; 
        } 
       } 
      } 

這是我想獲得該項目的索引列表框中單擊的方式。 我有錯誤。選中

請幫忙。

回答

13

您可以從listView中獲得SelectedIndex。無需遍歷所有項目,因爲根據您的代碼,您似乎對任何選定項目的索引感興趣。

var2 = ListView1.SelectedIndex; 

OR

只是這工作,如果感興趣的只是第一個索引:

if (lst.SelectedItems.Count > 0) 
{ 
    var2 = lst.Items.IndexOf(lst.SelectedItems[0]); 
} 
+0

嘿!謝謝!!!我會嘗試你的兩個解決方案。謝謝謝謝謝謝! – Glenn

1

對於Visual Studio 2015年,SelectedIndex似乎並不可用。相反,你可以使用SelectedIndices[x]其中x=0會給你第一個選擇項:

listView.SelectedIndices[0] 

您還可以將MultipleSelect屬性設置爲false,只允許在同一時間要選擇一個項目。

+0

它在WPF中可用,這是一個WPF問題。也許你在使用winforms。 –

0

爲什麼不帶回SelectedIndex?在當前命名空間之後添加此擴展。

public static class Extension 
{ 
    public static int SelectedIndex(this ListView listView) 
    { 
     if (listView.SelectedIndices.Count > 0) 
      return listView.SelectedIndices[0]; 
     else 
      return 0; 
    } 
} 

將此類封裝到名爲Extensions的名稱空間中,然後將其添加到項目命名空間中以使用擴展名。

using Extensions; 

然後,只需使用這樣

private void ListView1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     int selectionindex = ListView1.SelectedIndex(); 
     ListViewItem seletedItem = ListView1.Items[selectionindex];   
    } 

附: 擴展方法應該在Else上返回-1,但只要您從SelectedIndexChanged事件中使用它,就沒有問題,因爲如果沒有項目,它將不會被觸發。 這是由DesignIndexChanged事件觸發兩次而設計的。一旦取消選擇初始項目,然後選擇新項目。 正確的方法是返回-1並檢查負數。 這也是爲什麼這裏有人得到和ArgumentOutOfRange異常。

+0

這是一個WPF問題,而不是一個winforms問題。 [WPF ListView控件繼承SelectedIndex表單選擇器](https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedindex(v = vs.110).aspx)。很有可能有人試圖在winforms中做同樣的事情,最終可能會在這裏找到答案,但至少應該在答案中記下這個區別。 –

1

如果您使用.NET Compact Framework,則不支持SelectedIndex。對於一般的解決方案,我更喜歡SelectedIndices

ListView.SelectedIndexCollection indices = lst.SelectedIndices; 
if (indices.Count > 0) 
{ 
    // Do something with indices[0] 
} 
+0

這是一個非常古老的問題。我已經選擇了一個答案。當我發佈時,我還是一名學生。 :)現在我是一個iOS開發人員哈哈。 – Glenn

+0

很酷,恭喜!通過網絡搜索找到您的問題,並認爲有關.NET Compact Framework的詳細信息可能會引起其他開發人員的興趣... – AlainD

0

它可以返回NULL。此外,SelectedIndexChanged事件可以是FIRED TWICE。第一次,還沒有選擇。

所以,唯一安全的方式來發現它是這樣的:

private void lv1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (lv1.FocusedItem == null) return; 
     int p = lv1.FocusedItem.Index; 

...現在int p具有正確的值...

0

sColl.Clear(); string item = String.Empty;

 if (listView1.SelectedItems.Count > 0) 
     { 
      for (int i = 0; i < listView1.SelectedItems.Count; i++) 
      { 
       if (listView1.SelectedItems[i].Selected) 
       { 
        int i2 = listView1.SelectedItems[i].Index; 
        item = listView1.Items[i2].Text; 
        sColl.Add(item); 
       } 
      } 
     } 

     listView1.SelectedItems.Clear(); 
     foreach (var itemS in sColl) 
     { 
      string items = itemS; 
     } 

     sColl.Clear(); 
     listView1.SelectedItems.Clear(); 
相關問題