2010-02-16 10 views
5

Ok so versuche ich Elemente von einem listbox zum anderen zu bewegen durch die Verwendung mehrerer Tasten dhDeaktivieren Tasten Problem auf C#

Ich habe 2 Tasten cmdRight und cmdRight2, die sowohl auf Last Form deaktiviert sind

Wenn Der Benutzer wählt ein einzelnes Element in der ersten Listbox aus. Eine cmdRIGht-Schaltfläche aktiviert, aber cmdRight2 ist weiterhin deaktiviert. Wenn der Benutzer mehrere Elemente in der ersten Listbox auswählt, wird eine CmdRight2-Schaltfläche aktiviert, aber cmdRight wird deaktiviert.

Ich habe die Move - Tasten zu arbeiten, aber das Problem, das ich habe, ist nach dem Verschieben mehrerer Elemente mit der CmdRight2 - Taste die Schaltfläche aktiviert cmdRight (was sollte es sollte nur nach der Auswahl eines einzigen Elements in der Listbox). Ich habe zahlreiche if-Statements etc. ausprobiert und trotzdem passiert es immer noch.

Ich bin neu in C#, so würde jede Hilfe geschätzt werden.

Danke

 private void lbList1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (this.lbList1.SelectedItems != null) 
      { 
       cmdRight.Enabled = true; //enable cmdRight 
       cmdClear.Enabled = true; //enable cmdClear 
       if (this.lbList1.SelectedItems.Count > 1)//if multiple items selected 
       { 
        cmdRight.Enabled = false; 
        cmdRight2.Enabled = true; //enable cmdRight2    
       } 
      } 
     } 


    private void cmdRight2_Click(object sender, EventArgs e) 
    { 
     foreach (int i in lbList1.SelectedIndices) 
     { 
      lbList2.Items.Add(lbList1.Items[i].ToString()); 
     } 
     while (lbList1.SelectedItems.Count > 0) 
     { 
      lbList1.Items.Remove(lbList1.SelectedItems[0]); 
     } 
     cmdRight2.Enabled = false; 

    } 

    private void cmdRight_Click(object sender, EventArgs e) 
    { 
     lbList2.Items.Add(lbList1.SelectedItem); //Add selected item from list1 to list2 
     lbList1.Items.Remove(lbList1.SelectedItem);//remove the selected item in list1 

     cmdRight.Enabled = false; //disable cmdRight 
    } 
+0

Haben Sie Haltepunkte setzen bei der Anfang jeder Funktion, um die Reihenfolge zu sehen, in der sie aufgerufen werden? Oder zumindest ein Haltepunkt jedes Mal, wenn cmdRight.Enabled auf true gesetzt ist. – taylonr

+1

Dies ist keine Antwort auf Ihre Frage, aber warum kombinieren Sie nicht einfach die beiden Schaltflächen (indem Sie einfach cmdRight entfernen und cmdRight2 beibehalten)? Offensichtlich kenne ich Ihr Design nicht, aber es würde wahrscheinlich Ihr Problem lösen. –

+0

Ich habe versucht, die Haltepunkte und aus irgendeinem Grund die if-Anweisung "if (this.lbList1.SelectedItems! = Null)" scheint immer wahr zu sein. Auch wenn nichts ausgewählt ist. –

Antwort

1

Ich glaube, Sie wollen

if (this.lbList1.SelectedItems.Count == 1) 
{ 
} 
else if(this.lbList1.SelectedItems.Count > 1) 
{ 
} 
else 
{ 
} 

statt

if (this.lbList1.SelectedItems != null) 

Dann könnte man all dies in einem Verfahren „EnableButtons“ genannt platzieren, wie an anderer Stelle erwähnt

+0

Yey !!! Das hat dir soooo viel geholfen! Ich werde die Methoden als nächstes erforschen. Vielen Dank! Versuchen Sie es tun Sie das seit der letzten Nacht. –

+0

Wenn Sie Probleme bearbeiten und etwas wie SelectedItems nie null sehen, müssen Sie einen anderen Schalter finden (wie in diesem Fall die Anzahl der Elemente s gewählt) – taylonr

3

Wie wäre es ein Verfahren EnableButtons schaffen, die vorgegebenen Kriterien nach/deaktiviert zu Tasten ermöglicht wie „enable cmdRight2 nur, wenn .... wahr ist“.

Rufen Sie die Methode dann auf, wenn sich einige der Kriterien ändern. Der Vorteil gegenüber dem, was Sie jetzt tun, ist, dass die Kriterien innerhalb der Methode "absolut" sind (die Schaltflächen sind entweder aktiviert oder deaktiviert) und nicht "relativ" (aktivieren Sie die Schaltfläche beim Benutzer) tut das oder das).

Sie können diese Methode auch vom Ereignis Application.Idle aufrufen, anstatt sie als Reaktion auf eine Benutzeraktion aufzurufen.

EDIT

Deklarieren Sie die folgende Methode:

private void EnableButtons() 
{ 
    controlX.Enabled = (<condition...>); 
    controlY.Enabled = (<condition...>); 
} 

Sie entweder diese Methode aus den Positionen im Code aufrufen kann, wo in den Tasten aktiviert Zustände ändern, oder Sie können die etwas tun sollte folgt im Konstruktor des Formulars:

public Form1() 
{ 
    // Other code... 

    Application.Idle += new <The respective event handler>; 
} 

Dann deklarieren Sie eine Methode mit der jeweiligen Signatur für das Ereignis und rufen Sie EnableButtons dort. Diese Methode wird in Situationen aufgerufen, in denen Ihre Anwendung "inaktiv" ist (auf Benutzeraktionen warten).

+0

Ich bin ziemlich neu im Programmieren, also bin ich Bin mir nicht sicher, wie ich das machen soll ...: -S –

+0

Guter Vorschlag, aber er muss trotzdem die Logik zum Aktivieren/Deaktivieren beheben. – taylonr

+0

@KP: Ich habe meine Antwort mit Pseudo-Code bearbeitet. Sie werden es leicht finden aus, was ich meine - ich habe gerade nicht die richtige Syntax im Moment. –

0

Das Problem ist, dass Sie die Elemente nacheinander entfernen. Wenn also nur noch ein Element übrig ist, haben Sie im Wesentlichen ein Element ausgewählt, so dass Ihr Programm die cmdRight aktiviert. Der einfachste Weg ist

am Ende der cmdRight2_Click-Methode.

Verwandte Themen