Cela fait déjà environ une heure que je cherche et je ne trouve pas la meilleure solution . Je suis en train de migrer de VB.NET vers C # Forms et vers C # WPF .. J'utilise ce code pour les formulaires C # et cela fonctionne, mais pas dans C # WPF
if (ListView1.SelectedItems.Count > 0)
{
for (lcount = 0; lcount <= ListView1.Items.Count - 1; lcount++)
{
if (ListView1.Items[lcount].Selected == true)
{
var2 = lcount;
break;
}
}
}
c’est ainsi que je veux obtenir l’index de l’élément cliqué dans la liste déroulante . J'ai l’erreur dans .SELECTED
s'il vous plaît aider.
Vous pouvez obtenir SelectedIndex
à partir de listView. Pas besoin de parcourir tous les éléments, car selon votre code, vous semblez être intéressé par l'index de tout élément sélectionné.
var2 = ListView1.SelectedIndex;
OR
tout simplement cela fonctionnera si vous êtes intéressé uniquement par le premier index:
if (lst.SelectedItems.Count > 0)
{
var2 = lst.Items.IndexOf(lst.SelectedItems[0]);
}
Si vous utilisez le .NET Compact Framework, SelectedIndex
n'est pas pris en charge. Pour une solution générale, je préfère SelectedIndices
:
ListView.SelectedIndexCollection indices = lst.SelectedIndices;
if (indices.Count > 0)
{
// Do something with indices[0]
}
Pour Visual Studio 2015, SelectedIndex
ne semble pas être disponible. Au lieu de cela, vous pouvez utiliser SelectedIndices[x]
où x=0
vous donnera le premier élément sélectionné:
listView.SelectedIndices[0]
Vous pouvez également définir la propriété MultipleSelect
sur false
pour autoriser la sélection d'un seul élément à la fois.
Il peut retourner NULL. De plus, l'événement SelectedIndexChanged peut être FIRED TWICE. Et la première fois, il n'y a encore rien de sélectionné.
Donc, le seul moyen sûr de le trouver est le suivant:
private void lv1_SelectedIndexChanged(object sender, EventArgs e)
{
if (lv1.FocusedItem == null) return;
int p = lv1.FocusedItem.Index;
... maintenant int p a la valeur correcte ...
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();
Pourquoi ne ramène pas le SelectedIndex? Ajoutez cette extension après votre espace de noms actuel.
public static class Extension
{
public static int SelectedIndex(this ListView listView)
{
if (listView.SelectedIndices.Count > 0)
return listView.SelectedIndices[0];
else
return 0;
}
}
Encapsulez cette classe dans un espace de noms appelé Extensions, puis ajoutez-la à l'intérieur de l'espace de noms de vos projets pour utiliser l'extension.
using Extensions;
Ensuite, utilisez simplement comme ceci
private void ListView1_SelectedIndexChanged(object sender, EventArgs e)
{
int selectionindex = ListView1.SelectedIndex();
ListViewItem seletedItem = ListView1.Items[selectionindex];
}
P.S . La méthode d'extension aurait dû renvoyer -1 sur Else, mais tant que vous l'utilisez depuis l'événement SelectedIndexChanged, tout va bien, car elle ne sera pas déclenchée s'il n'y a aucun élément. Cela est inhérent à la conception, car l'événement SelectedIndexChanged est déclenché deux fois. Une fois pour désélectionner le premier élément, puis pour en sélectionner un nouveau… .. La méthode correcte consiste à renvoyer -1 et à vérifier le nombre négatif… .. C'est aussi la raison pour laquelle quelqu'un ici a eu l'exception ArgumentOutOfRange.