7 Stimmen

ComboBox verliert nicht den Fokus

Ich habe Probleme mit dem ComboBox-Steuerelement gehabt. Ich bin kein Experte in GUI, aber ich weiß, dass dieses Problem mit dem Fokus des Steuerelements verbunden ist.

Aus irgendeinem Grund verliert die ComboBox ihren Fokus nicht, wenn ich außerhalb von ihr klicke. Sagen wir zum Beispiel:

  1. Ich klicke auf die ComboBox, um ihre Elemente aufzulisten.
  2. Ich wähle einen Artikel aus. Dadurch wird die ComboBox geschlossen.
  3. Ich klicke auf die zweite ComboBox, die erste bleibt fokussiert.

O

  1. Klicken Sie auf eine ComboBox (enthält Point, Solid und Wireframe).
  2. Klicken Sie auf das Formular. Drücken Sie entweder P, S oder W. Sehen Sie, wie die Auswahl geändert wird.

Beachten Sie, dass die ComboBox nur über die DropDownStyle eingestellt auf ComboBoxStyle.DropDownList . Das bedeutet, dass dies das Standardverhalten der ComboBox ist. Ich dachte, das Standardverhalten sei, dass die ComboBox ihren Fokus verliert, wenn Sie aus ihr heraus oder auf ein anderes Steuerelement (Schaltfläche oder ComboBox) klicken. Das ist hier nicht der Fall, warum?

UPDATE : Was ich brauche, ist eine Art von ActiveComponent = null. Das Verhalten sollte ähnlich wie das von Visual Studio sein, wo Sie Debug oder Release (ComboBox) in der Standard-Symbolleiste auswählen. Derzeit, wenn ich außerhalb der ComboBox klicken, ist es noch fokussiert.

0voto

Michael Korin Punkte 46

Ich weiß, dass dieser Beitrag schon eine Weile her ist, aber vielleicht hilft er jemandem, der in Zukunft auf das gleiche Problem stößt. Ich kämpfte für ein paar Tage mit diesem, aber schließlich Zahlen es aus.

wenn Sie CauseViolation auf false setzen, lösen Sie das Problem nicht und die Datenbindung funktioniert nicht mehr.

Wenn Sie SelectedItem auf die Eigenschaft wie folgt einstellen

combobox.DataBindings.Add("SelectedItem", someObject, "MySelectedItemProperty", false, DataSourceUpdateMode.OnPropertyChanged)

combobox ruft die Methode Equals des Objekts auf, das Sie in der Liste verwenden, die Ihrer DataSource zugewiesen ist. In meinem Fall musste ich die Equals-Methode in diesem Objekt überschreiben. Aus irgendeinem dummen Grund ruft combobox diese Methode auf und übergibt System.DBNull, bevor der richtige Objekttyp zum Vergleich übergeben wird. Dies ist der Grund, warum die Verletzung in meinem Fall auftrat und dazu führte, dass die Verletzung fehlschlug und der Cursor nicht aus der Combobox freigegeben wurde. Das Seltsame war auch, dass das Programm nicht anhielt, als die Exception in meiner Equals-Methode verursacht wurde.

Sobald ich diesen Code hinzugefügt habe

 if (obj.GetType() != this.GetType())
       return false;

zu meiner Equals-Methode hinzugefügt, hat alles gut funktioniert. Hoffentlich hilft das jemandem.

0voto

Taja_100 Punkte 423
 private void drp_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                SendKeys.Send("{TAB}");
            }
        }

oder verwenden

diesen Code auf die Funktion "Kontrollieren verlassen":

 private void drp_Leave(object sender, KeyPressEventArgs e)
            {

                    SendKeys.Send("{TAB}");

            }

0voto

Mubsher Mughal Punkte 422

Ich habe es wie folgt gemacht.

Schritt 1 - Erstellen Sie eine Methode, die alle gegebenen Steuerelemente auf dem Formular zurückgibt

    public IEnumerable<Control> GetAllControls(Control control, Type type)
    {
        var controls = control.Controls.Cast<Control>();
        return controls.SelectMany(ctrl => GetAllControls(ctrl, type))
                                  .Concat(controls)
                                  .Where(c => c.GetType() == type);
    }

Schritt 2 - Erstellen eines benutzerdefinierten Ereignisses

    private void ChangeComboFocus(object sender, EventArgs e)
    {
        SendKeys.Send("{TAB}");
    }

Schritt 3 - Binden Sie das Ereignis schließlich beim Laden des Formulars

    private void ClientRegistrationForm_Load(object sender, EventArgs e)
    {
        var comboxes=_Helper.GetAllControls(this, typeof(ComboBox)).ToList();
        if (comboxes != null)
        {
            foreach (ComboBox item in comboxes)
            {
                item.SelectedIndexChanged +=new EventHandler(this.ChangeComboFocus) ;
            }
        }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X