2010-09-21 6 views
8

Ich habe ein Formular mit einer Schaltfläche an die Eigenschaft AcceptButton angeschlossen, so dass Logik auftritt und das Formular geschlossen wird, wenn der Benutzer die Return-Taste drückt.Prevent WinForm AcceptButton-Behandlung Return-Taste

Auf diesem Formular zeige ich eine dynamisch erstellte TextBox, die angezeigt wird, wenn der Benutzer einen bestimmten Bereich doppelklickt und dann ausgeblendet wird, wenn der Benutzer auf Return drückt.

Wie verhindere ich, dass das Formular den Tastendruck verarbeitet, wenn der Benutzer Zurückkehrt drückt, während der Fokus auf TextBox liegt?

ich der Tastendruck behandelt wurde in den TextBox.KeyDown Ereignishandler über KeyEventArgs.Handled aber das Button.Click Ereignis meiner annehmen Taste ausgelöst wird, wird zuerst ein ...

Antwort

10

Verwenden Sie die Enter und Leave Ereignisse der TextBox zu sagen versuche, zu Setzen Sie die Eigenschaft AcceptButton auf null (unter Enter) und weisen Sie die Schaltfläche erneut zu (unter Leave).

+2

Es ist so offensichtlich, sobald jemand darauf hinweist! :) –

+1

Es ist offensichtlich, aber wir sind immer in einer Situation, in der wir nicht sicher sind, ob dies die Lösung ist. – Samuel

+0

@Samuel: Weil du deinen Kommentar gepostet hast, nachdem ich meine [Antwort] (http://stackoverflow.com/a/15108697/968531) unten gepostet habe: Das ist IMHO nicht * das * was zu tun ist, weil keine Problemumgehung notwendig ist. IMHO ist es * ein * Weg, es zu tun, aber nicht * der * Weg ^^ – NobodysNightmare

4

Stellen Sie die AcceptButton Eigenschaft auf null, wenn Sie diese Textbox erstellen, und es wieder auf den normalen Wert gesetzt, wenn es den Fokus verliert:

var myTextBox = new TextBox ... ; 
AcceptButton = null; 

myTextBox.Leave += (s, e) => { AcceptButton = btnOK; }; 
11

Während die Formen Zurücksetzen AcceptButton während der TextBox Fokus hat funktioniert, ich glauben, dass die geeignetere Lösung ist, die TextBoxes AcceptsReturn Property zu verwenden.

Wenn Sie

myTextBox.AcceptsReturn = true; 

das Formular auf drücken RETURN nicht akzeptieren eingestellt, aber Ihr TextBox kann dies selbst behandeln.

Dadurch müssen Sie das AcceptButton nicht an mehreren Stellen in Ihrem Code zurücksetzen.

+2

So viel bessere und elegante Lösung, +1! –

+0

Diese Lösung funktioniert nur, wenn die 'Multiline' -Eigenschaft des TextBox True ist. – fusi

1

Um ein vollständiges Arbeitsbeispiel zu erhalten, verwenden Sie AcceptReturn = true des TextBox als NobodysNightmare suggested und setzen Sie SuppressKeyPress auf true, um zu vermeiden, dass das Ereignis in das Formular übergeht. Um den AcceptButton zu verwenden, müssen Sie die AcceptButton-Eigenschaft festlegen/zurücksetzen, wenn Sie die Texbox als Fredrik Mörk suggested eingeben/verlassen.

var tb = new TextBox ...; 
IButtonControl _oldAcceptButton = null; 
tb.AcceptReturn=true; 
tb.KeyDown += (s,e) => { 
    if(e.KeyCode==Keys.Enter) { 
    e.Handled=true; 
    //will not inform any parent controls about the event. 
    e.SuppressKeyPress=true; 

    //do your own logic 
    .... 
    } 
}; 
tb.Enter+=(s,e)=> { 
    _oldAcceptButton = AcceptButton; 
    AcceptButton = null; 
}; 
tb.Leave+=(s,e)=>{ 
    AcceptButton = _oldAcceptButton; 
};