2009-02-04 9 views
12

Ho letto altrove qui per catturare il tratto di tasto "Invio" in una casella di testo e usarlo come se si premesse un pulsante Dovrei impostare la proprietà KeyPreview del modulo su true e controllare il valore di KeyDown.Come determinare quale controllo sul modulo è attivo?

Desidero poter utilizzare questa funzionalità su diversi controlli TextBox che sono associati a un pulsante diverso.

La mia domanda è: come faccio a sapere quale controllo ha causato l'evento KeyPress? Il mittente è elencato come il modulo stesso.

G

risposta

5

Ho trovato una soluzione che sembra funzionare.

private void DeviceForm_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyValue == 13 && tstxtDeviceFilter.Focused) 
     { 
      filterByDeviceSN(); 
     } 
    } 

Non posso fare a meno di pensare che ci deve essere un modo migliore però!

--edit - modifica - modifica - EDIT - EDIT--

Ebbene, dopo aver guardato i suggerimenti qui sotto (grazie) ho trovato un modo 'migliore' per me in questo circostanza.

this.tstxtDeviceFilter.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tstxtDeviceFilter_KeyDown); 

    private void tstxtDeviceFilter_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyValue == 13) 
     { 
      filterByDeviceSN(); 
     } 
    } 

Ovviamente intrappolando l'evento sul testo stesso, piuttosto che la forma non ho bisogno di preoccuparsi di messa a fuoco. Ancora una volta mi sento stupido per non averlo pensato per così tanto tempo!

4

Ogni modulo ha una proprietà per un pulsante "Accetta" & Pulsante "Annulla", questi sono i pulsanti che vengono "cliccati" quando l'utente preme rispettivamente Invio e Esci.

È possibile modificare il pulsante di default come ogni controllo ottiene la messa a fuoco (si può avere uno ottenuto curva evento di messa a fuoco per ogni tasto, e condividerlo con una serie di caselle di testo)

Se fai questo allora l'apperance i pulsanti cambiano dando all'utente un segnale visivo che indica quale pulsante è l'impostazione predefinita.

In alternativa, se non si desidera farlo, è possibile utilizzare la proprietà "ActiveControl" e testare per vedere quale dei set di caselle di testo appartiene.

Ti sei chiesto, quale dovrebbe essere il pulsante predefinito se non è una delle caselle di testo?

+0

Grazie BW, questa è un'informazione utile da sapere. Penso che andrò con la mia risposta in questo caso perché sono interessato solo a premere "Invio" nella singola casella di testo e solo quando ha il focus. Grazie! –

+0

Il commento di G mi ha fatto capire dove stavo sbagliando, grazie per maggiori dettagli. La mia app è per lo più solo questa finestra di dialogo, quindi non ha nemmeno un pulsante e non si chiude mai, tranne quando esci. –

3

Hai provato Form.ActiveControl?

+2

Ho dato un'occhiata a questo, ma dove mi aspetterei di trovare il nome del controllo con lo stato attivo "this.ActiveControl.Name" era una stringa vuota. Probabilmente sto facendo qualcosa di molto ovviamente sbagliato! –

0

È possibile utilizzare questo codice come punto di partenza per acquisire gli eventi chiave del modulo. ActiveControl è uno che ha il focus. In questo esempio, è flessibile per aggiungere altre azioni su "Invio" quando ci si trova in diversi TextBox nel modulo. È VB.NET, ma dovresti essere in grado di convertire facilmente in C#.

Private Sub MyForm_KeyDown(ByVal sender As Object, _ 
    ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 

    If e.KeyCode = Keys.Enter Then 
     If Me.ActiveControl.Name = Me.TextBox1.Name Then 
      ' This is the TextBox we want to be active to run filterByDeviceSN() 
      filterByDeviceSN() 
     ElseIf Me.ActiveControl.Name = Me.TextBox2.Name Then 
      foo() 
     End If 
    End If 
End Sub 
+0

ActiveControl.Il nome restituisce una stringa vuota. ActiveControl.Text si comporta come previsto restituendo la stessa stringa che si trova attualmente nella casella di testo. "this.ActiveControl.Equals (tstxtDeviceFilter)" restituisce false. Penso che per ora andrò con la mia risposta. A meno che qualcuno non sappia come ottenere il nome? –

Problemi correlati