2011-01-07 7 views
2

Ich begann gerade in C# Entwicklung, und ich arbeitete an einem formularbasierten Projekt und ich versuche, eine "Registerkarte" Aktion durchzuführen, wenn der Benutzer in einem Formular ist und drückte die Eingabetaste.Wie interpretiere ich eine Enter KeyPress als Tab in C#

Ich weiß, die Antwort ist wahrscheinlich ziemlich einfach, aber ich bin ein Neuling in diesem Bereich.

+0

möglich Duplikat von [Wie auf einem TextBox wirken als TAB Enter-Taste machen] (http://stackoverflow.com/questions/371329/how-to-make-enter-on-a-Textfeld-act-as-tab-button) –

+0

Es ist erwähnenswert, dass dies * nicht * das Standardverhalten in Windows ist. Ein Überschreiben ist nicht nur verwirrend für Ihre Benutzer, sondern der Versuch, die Standardeinstellungen zu überschreiben, ist immer mehr Arbeit, als nur so zu handeln, wie es von Ihrer Plattform erwartet wird. Code wie dieser kann leicht zu einem Wartungsalbtraum werden, in dem seltsame Bugs lauern. –

Antwort

11

Willkommen bei SO Tex,

Ich glaube, es gibt zwei Methoden, um dies zu erreichen, würde bedeuten, nur Zugabe:

Option 1: Ergreifung der nächste Steuer wenn ein Geben Sie KeyPress ausgeführt wurde

Legen Sie in den Eigenschaften Ihres Formulars die KeyPreview Eigenschaft des Formulars zu true fest.

Der folgende Code wird erfassen Ihre „Enter-Taste“ Ereignis und führen Sie die Logik, die Sie suchen:

private void [YourFormName]_KeyDown(object sender, KeyEventArgs e) 
{ 
    Control nextControl ; 
    //Checks if the Enter Key was Pressed 
    if (e.KeyCode == Keys.Enter) 
    { 
     //If so, it gets the next control and applies the focus to it 
     nextControl = GetNextControl(ActiveControl, !e.Shift); 
     if (nextControl == null) 
     { 
      nextControl = GetNextControl(null, true); 
     } 
     nextControl.Focus(); 
     //Finally - it suppresses the Enter Key 
     e.SuppressKeyPress = true; 
    } 
} 

Dies ermöglicht es tatsächlich für den Benutzer „Shift + Enter“ drücken, um die gehen Registerkarte weitergehen.

Option 2: Verwenden der SendKeys Methode

private void [YourFormName]_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
    SendKeys.Send("{TAB}"); 
    } 
} 

Ich bin nicht sicher, ob diese Methode kann noch häufig verwendet wird, oder ein „Hack“ in Betracht gezogen werden? Ich würde die erste empfehlen, aber ich glaube, beide sollten für Ihre Bedürfnisse arbeiten.

+0

Ich würde Option 2 definitiv persönlich empfehlen.Es stellte sich als viel einfacher für mich heraus und das Verhalten ist genau das, was wir in diesem Fall sowieso suchen. Vielen Dank! – Bonez024

1

Zuerst bereiten Sie ein Dictionary von, wo der Schlüssel das erste Steuerelement ist und der Wert das zweite ist. Durchlaufen Sie alle Steuerelemente in der Control-Auflistung des Formulars, fügen Sie sie in eine sortierte Liste mit TabIndex ein und konvertieren Sie sie in ein Dictionary.

Sie müssten für jedes Objekt Codecode im KeyPress-Ereignis oder für die Unterklasse TextBox benötigen, um diese Logik einzuschließen. Wie auch immer, erhalten Sie im KeyPress-Ereignis, wenn die Eingabe die Eingabe ist, das folgende Steuerelement aus Ihrem Wörterbuch und verwenden Sie Control.GetFocus().

Hoffe, dass hilft! Ich kann mehr Details zur Verfügung stellen, wenn Sie möchten.

+2

Güte, nein, tu das nicht. –

+0

@ Cody- Was ist traurig, ich dachte tatsächlich, dies selbst zu tun, aber nur weil eine ToolStripBar Steuerelemente haben keine TabStop-Eigenschaft standardmäßig, wir am Ende nur den ToolStrip loszuwerden (wir waren in einem Stadium, wo dies möglich war). –

+0

@Ramhound: Das liegt daran, dass Elemente auf einem 'ToolStrip' /' ToolStripMenuBar' nicht den Fokus erhalten können. Egal in welcher Phase des Projekts Sie entdeckt haben, dass Sie es loswerden und Ihr Design ändern müssen. –

0

Sie können Tastaturereignisse auf Formularebene und auf vollständiger Anwendungsebene mit Application.AddMessageFilter und IMessageFilter-Schnittstelle behandeln.

Alle diese Ereignisse hatten die Eigenschaft "Handled", die Sie auf "True" setzen können, wenn Sie einen Schlüssel manuell verarbeiten. (In Ihrem Fall Enter-Taste).

Hier ist ein Beispiel, wie die wichtigsten Ereignisse zu stoppen für beide Ebenen: Keyboard event handling in .NET applications

0
private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
{ 
     SendKeys.Send("{UP}"); 
     SendKeys.Send("{Right}"); 
} 

private void onEnterKeyPress(object sender, KeyPressEventArgs e) 
{ 

     if (sender is DataGridView) 
     { 
     int iColumn = DataGridView1.CurrentCell.ColumnIndex; 
     if (iColumn == DataGridView1.Columns.Count - 1) 
     { 
       SendKeys.Send("{home}"); 
     } 
     else 
     { 

       this.ProcessTabKey(true); 
     } 
     } 
} 
Verwandte Themen