2017-05-30 4 views
1

Ich habe eine listView von Elementen, in denen der Benutzer nur einen zu einem Zeitpunkt auswählen kann. Ich habe den folgenden Code, der nur richtig funktioniert, wenn ich es in einen try/catch-Block setze. Das Problem ist, dass einige der Elementnamen zu lang sind, und sie verursachen viel Leerraum für die anderen Elemente. Wenn Sie auf den Leerraum klicken, wird ArgumentOutOfRangeException angezeigt, obwohl es sich in der gleichen Zeile wie ein Element befindet. Ich habe das gelöst, indem ich es in einen try/catch-Block geschoben habe, aber ich denke, das ist eine schmutzige Art, es zu tun, auch wenn es funktioniert. Unten ist der Code.ListView Artikelauswahl und Ausnahmebehandlung

private void listView1_DoubleClick(object sender, EventArgs e) 
{ 
    try 
    { 
     string[] arr1 = File.ReadAllLines(listView1.SelectedItems[0].Tag.ToString()); 
     string[] arr2 = arr1[0].Split(';'); 
    } 
    catch 
    { 
     //no catch 
    } 
} 

Ich möchte diese ganz vermeiden, aber ich weiß nicht, wie Sie den Code ändern, um es ohne die try/catch zu arbeiten. Ich habe versucht if(!String.IsNullOrEmpty), aber es funktioniert immer noch nicht. Was ist die Lösung hier?

+1

Verwenden Sie nicht versuchen, wenn Sie listView1.SelectedItems.Count testen sollten! Dies ist ein normaler Fall. Staple auch nicht so viele Befehle in eine Zeile; schwer zu debuggen und in der Art beim Hinzufügen von Prüfungen .. – TaW

+0

Das zugrunde liegende Problem ist, dass ich möchte, dass der Benutzer immer die Zeile, auf der das Element ist, unabhängig davon, wo er klickt, Name oder Leerzeichen auswählen. – EInherjar

+0

Ja, das stimmt, aber mein Rat gilt immer noch! Welchen View-Modus benutzen Sie? – TaW

Antwort

3

Da Ihre ListView ist in View=List Auswahl macht es notwendig, den Artikel Text zu treffen.

Das ist unbequem Ich muss zugeben und turnnig on FullRowSelect hilft nicht, da es nur für View=Details ist.

Hier ist eine schnelle Lösung:

private void listView1_MouseDoubleClick(object sender, MouseEventArgs e) 
{ 
    var hit = listView1.HitTest(e.Location); 
    if (hit.Item != null) 
    { 
     string file = hit.Item.Text; 
     string[] arr1 = null; 
     if (File.Exists(file)) arr1 = File.ReadLines(file).ToArray(); 
     ... 
    } 
} 

Sie können stattdessen auf den Grund des Problems gehen und den Code zu dem zu wählen die Zeile MouseUp Ereignis hinzufügen ..:

private void listView1_MouseUp(object sender, MouseEventArgs e) 
{ 
    var hit = listView1.HitTest(e.Location); 
    if (hit.Item != null) hit.Item.Selected = true; 
} 

Beachten Sie, dass die HitTest nur Items fangen wird, leer oder nicht, nicht wirklich empty Hintergrund Platz auf der rechten oder unteren ..!