2010-09-21 9 views
8

Mam formularz z przyciskiem doczepionym do nieruchomości AcceptButton tak, że logika i występuje forma jest zamknięta, gdy użytkownik naciśnie klawisz Enter.Prevent WinForm AcceptButton obsługi Return klucz

W tym formularzu wyświetlana jest dynamicznie utworzona TextBox, która pojawia się, gdy użytkownik dwukrotnie kliknie określony obszar, a następnie chowa się, gdy użytkownik naciśnie klawisz Return.

Jak mogę zapobiec formularz z przetwarzania klawisz nacisnąć, gdy użytkownik naciśnie Enter natomiast TextBox ma skupić?

I próbował powiedzieć kluczem prasową obsługiwane w module obsługi TextBox.KeyDown zdarzeń poprzez KeyEventArgs.Handled ale zdarzenie Button.Click mojej akceptacji przycisk jest zwolniony pierwszy ...

Odpowiedz

10

Użyj Enter i Leave wydarzenia TextBox do ustawić właściwość AcceptButton do null (na Enter) i ponownie przypisać przycisk do niego (na Leave).

+2

To takie oczywiste, gdy ktoś to zauważy! :) –

+1

To jest naprawdę oczywiste, ale zawsze jesteśmy w sytuacji, w której nie jesteśmy pewni, czy to jest sposób na obejście tego problemu. – Samuel

+0

@Samuel: Bo pisał swój komentarz po tym, jak pisał mój [Odpowiedź] (http://stackoverflow.com/a/15108697/968531) poniżej: Jest to IMHO nie * i * rzeczą do zrobienia, bo nie obejście jest konieczne. IMHO to * sposób * to zrobić, ale nie * droga *^ – NobodysNightmare

4

Ustaw właściwość AcceptButton null podczas tworzenia tej tekstowe i ustawić ją z powrotem do normalnej wartości, gdy traci fokus:

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

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

Podczas resetowania Forms AcceptButton gdy pole tekstowe ma fokus będzie działać, ja uważają, że właściwszym rozwiązaniem jest użycie właściwości TextBoxes AcceptsReturn.

Jeśli ustawisz

myTextBox.AcceptsReturn = true; 

Formularz nie zaakceptuje po naciśnięciu RETURN, ale Twój TextBox może obsługiwać ten sam.

To pozwoli uniknąć konieczności zresetowania AcceptButton w wielu miejscach w kodzie.

+2

O wiele lepsze i eleganckie rozwiązanie, +1! –

+0

To rozwiązanie działa tylko wtedy, gdy właściwość "Multiline" w TextBox jest prawdziwa. – fusi

1

Aby uzyskać pełny przykład działania, użyj AcceptReturn = true dla TextBox jako NobodysNightmare suggested i ustaw SuppressKeyPress na wartość true, aby uniknąć zdeformowania zdarzenia do formularza. Aby użyć AcceptButton, musisz ustawić/zresetować właściwość AcceptButton po wejściu/opuszczeniu texbox jako Fredrik Mörk suggested.

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; 
}; 
Powiązane problemy