2012-08-10 1 views
5

Visual Studio 2010, C# TabbingWie eine WinForm-Taste in der Zeit ermöglichen, den Fokus erhalten von

Ich habe ein ComboBox mit einem DropDown, AutoComplete Set SuggestAppend und die AutoCompleteSource ist vom ListItems. Der Benutzer tippt Daten in ihn ein, bis er den richtigen Eintrag hat. Wenn die Daten mit einem der Listenelemente übereinstimmen, ist eine Schaltfläche neben der Combobox deaktiviert.

Wenn der Benutzer die Tabulatortaste drückt, akzeptiert die Funktion zur automatischen Vervollständigung den aktuellen Vorschlag. Es wird auch zum nächsten Steuerelement in der Tab-Reihenfolge weitergeleitet, das aktiviert ist. Natürlich, da ich möchte, dass es auf den Disabled Button geht, muss ich es aktivieren, sobald ich den Eintrag validiere.

Das Problem ist, dass keines der Ereignisse, die ich versucht habe, PreviewKeyDown, LostFocus, SelectedIndexChanged mir erlauben, den Knopf in der Zeit zu ermöglichen, für die es den Fokus proccessed und empfangen werden. Es geht immer zur nächsten Schaltfläche in der Tab-Reihenfolge, die immer aktiviert ist.

Ich bin etwa bereit, die Schaltfläche aktiviert zu lassen und es einen Fehler geben, wenn zu früh gedrückt, aber ich will es nicht so machen. Ich möchte auch nicht in spezielle Modus-Flags kommen, um zu verfolgen, wenn diese Steuerelemente den Fokus erhalten. Validierung scheint eine normale Sache zu sein, aber ich stecke fest.

Wenn die SelectedIndexChanged funktionierte, wenn der Benutzer eine Übereinstimmung machte, wäre dies einfach. Es wird nicht ausgelöst, wenn die Box gelöscht wird oder wenn eine getippte Übereinstimmung gefunden wird.

+0

Verwenden Sie das TextChanged-Ereignis. –

Antwort

0
try this : 

key_press Veranstaltung:

if (e.KeyData == Keys.Enter) 
     { 
      button2.Enabled = true; 
      button2.Focus(); 
     } 
+0

Dies wirkt sich nicht auf die Tab-Taste aus. Auch das KeyPress-Ereignis liefert keine KeyData. –

0

Anstelle der Veranstaltung hanlders Sie erwähnt haben, (Lost-Focus, SelectedIndexChanged und PreviewKeyDown) verwenden, um die "Validated" Event Ihrer Combobox den aktivierten Zustand der Taste.

Möglicherweise müssen Sie auch manuell auf die Schaltfläche fokussieren, um zu erzwingen, dass sich der Fokus dorthin bewegt.

z.B.

private void comboBox1_Validated(object sender, EventArgs e) 
    { 
     button1.Enabled = true; 
     button1.Focus(); 
    } 
+1

Das Zuweisen des Fokus in der Validierung setzt zu viel voraus. Asumming würde dort bleiben, was ist, wenn der Benutzer eine andere Schaltfläche auf dem Formular angeklickt hat? Es wird auch davor gewarnt in der Hilfe. Siehe meinen Kommentar zum Ahazza. –

+0

Das ist ein fairer Anruf. Ich habe missverstanden, was du mit "Ich möchte den Behinderten-Button" gemeint habe.Nach dem erneuten Lesen ist klar, dass Sie dieses Verhalten wollen, wenn der Benutzer die Tabulatortaste drückt. –

1

Sie könnten Ihre eigene ComboBox-Klasse erstellen, um dieses Verhalten einzukapseln. Etwas wie folgt aus:

using System; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      this.myComboBox1.TheButton = this.button1; 

      this.myComboBox1.Items.AddRange(new string[] { 
       "Monday", 
       "Tuesday", 
       "Wednesday", 
       "Thursday", 
       "Friday", 
       "Saturday", 
       "Sunday" 
      }); 

      button1.Enabled = false; 
     } 
    } 

    public class MyComboBox : ComboBox 
    { 
     public Control TheButton { get; set; } 

     public MyComboBox() 
     { 
     } 

     bool IsValidItemSelected 
     { 
      get { return null != this.SelectedItem; } 
     } 

     protected override void OnValidated(EventArgs e) 
     { 
      if (null != TheButton) 
      { 
       TheButton.Enabled = this.IsValidItemSelected; 
       TheButton.Focus(); 
      } 

      base.OnValidated(e); 
     } 

     protected override void OnTextChanged(EventArgs e) 
     { 
      if (null != TheButton) 
      { 
       TheButton.Enabled = this.IsValidItemSelected; 
      } 

      base.OnTextChanged(e); 
     } 
    } 
} 
+0

Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu erstellen. Ein Problem besteht darin, dass der Fokus der Schaltflächen im OnValidated-Ereignis festgelegt wird. Die VS2010-Hilfe gibt an: "Versuchen Sie nicht, den Fokus innerhalb der Ereignisbehandlungsroutinen Enter, GotFocus, Leave, LostFocus, Validieren oder Validiert festzulegen. Dies kann dazu führen, dass Ihre Anwendung oder das Betriebssystem nicht mehr reagiert." Zweitens finden die Validierungsereignisse nach dem Ereignis "Leave" statt, was ebenfalls zu spät ist, so dass es nicht so aussieht, als könnte ich nativ tun, was ich will. –

+0

"Es sieht also nicht so aus, als könnte ich tun was ich will." Die Testanwendung, die ich in meiner Antwort erstellt habe, macht was du willst. Hast Du es versucht? – ahazzah

+0

Nein, habe ich nicht, weil die Vorsicht sehr spezifisch zu sein scheint. Es funktioniert. Mit ein wenig mehr Tweening würde es die Schaltfläche aktivieren, sobald der Benutzer die Eingabe beendet hat. Ich habe eine andere Lösung, die eine Formularüberschreibung von ProcessCmdKey verwendet, die die Warnung nicht verletzt. Ich bin wahrscheinlich über wörtlich, aber ich bin neu in. Net nach der Arbeit in den letzten 15 Jahren mit Win32 mit Delphi und es gibt genug Unterschiede, die ich vorsichtig bin. –

0

Mit einigen Gedanken zu den anderen Antworten hier kam ich mit einem Teil senario bis die ohne Verwendung Auto-Vervollständigen funktioniert. Ein Nebeneffekt ist, dass das PreviewKeyDown-Ereignis ein zweites Mal aufgerufen wird und daher die Validierung zweimal aufgerufen wird. Ich frage mich warum ... vielleicht sollte ich eine andere Frage stellen.

private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { 
     if (e.KeyData == Keys.Tab) { 
     if (ValidationRoutine()) { 
      e.IsInputKey = true; //If Validated, signals KeyDown to examine this key 
     } //Side effect - This event is called twice when IsInputKey is set to true 
     }   
    } 

    private void comboBox1_KeyDown(object sender, KeyEventArgs e) { 
     if (e.KeyData == Keys.Tab) { 
      e.SuppressKeyPress = true; //Stops further processing of the TAB key 
      btnEdit.Enabled = true; 
      btnEdit.Focus(); 
     } 
    } 

Sobald Sie einschalten AutoCompleteMode mit jeder anderen Einstellung als None, das KeyDown Ereignis wird nicht für Tab mehr der Schlüssel still gegessen wird.

Verwandte Themen