2010-08-25 13 views
5

Su un'applicazione WinForms che sto scrivendo in C#, ho un DataGridViewTextBoxColumn con celle che contengono valori interi che vorrei che gli utenti fossero in grado di incrementare o decrementare usando i tasti + e - dalle loro tastiere.Utilizzo dei tasti della tastiera + (più) e - (meno) come incrementatori e decrementatori in un DataGridView

Ho gestito l'evento KeyDown perché è quello che uso di solito per gestire i tasti Canc, ecc. di conseguenza, l'evento KeyDown non viene mai attivato per tali chiavi. Lo stesso vale per l'evento KeyPress

In realtà, viene attivato se imposto le celle in sola lettura, ma non sono soddisfatto di questa soluzione poiché mi costringerebbe a impostare la proprietà da true a false in diverse aree del mio codice e potrebbe diventare rapidamente disordinato

Quale sarebbe il modo migliore per raggiungere questo obiettivo?

Grazie.

risposta

2

È necessario intercettare la sequenza di tasti prima che raggiungano il datagrid.

Questo sembra sorprendentemente vicino a quello che stai cercando di fare: http://support.microsoft.com/kb/320584

+0

OK, grazie. Funziona. In realtà, una soluzione più semplice di quella mostrata nella KB è quella di impostare la proprietà KeyPreview del modulo su true e quindi gestire l'evento KeyDown del modulo. Mentre funziona, presenta diversi inconvenienti: alcuni elementi logici di DataGridView si trovano negli eventi correlati alla maschera piuttosto che negli eventi di DataGridView. Dato che la cella va ancora in modalità di modifica anche con questa soluzione, ho dovuto tenere traccia di se i tasti sono stati premuti e nelle colonne corrette in un flag bool e di annullare l'evento CellBeginEdit se il flag è true per impedirlo andare in modalità di modifica. –

+0

A parte il fatto che non è elegante come avrei voluto, funziona abbastanza bene, quindi grazie mille. Lo lascerò aperto per un po 'nel caso in cui qualcun altro possa avere altri suggerimenti. –

2

Wow, che KB articolo è piuttosto male. Questo dovrebbe essere fatto sovrascrivendo IsInputKey().

Non mi interessa molto per DGV, è un bugger da personalizzare. Ma probabilmente si può colpire questo in un certo tipo di forma:

using System; 
using System.Windows.Forms; 

class MyDgv : DataGridView { 
    public event EventHandler Increment; 
    public event EventHandler Decrement; 

    protected override void OnKeyDown(KeyEventArgs e) { 
     bool used = false; 
     if (this.EditingControl == null) { 
      if (e.KeyData == Keys.Oemplus) { 
       if (Increment != null) { Increment(this, EventArgs.Empty); used = true; } 
      } 
      else if (e.KeyData == Keys.OemMinus) { 
       if (Decrement != null) { Decrement(this, EventArgs.Empty); used = true; } 
      } 
     } 
     if (used) e.SuppressKeyPress = e.Handled = true; 
     else base.OnKeyDown(e); 
    } 
} 
+0

Grazie, è elegante. Ho provato e funziona se cancello l'evento CellBeginEdit. Il problema è che l'evento OnKeyDown dei trigger DataGridView dopo l'evento CellBeginEdit, quindi non ho modo di determinare quale tasto è stato premuto dall'utente per annullare l'evento o meno. Qualche idea? Inoltre, tu dici che il DGV è un dolore da personalizzare: all'inizio pensavo fosse molto accurato, ma sono d'accordo sul fatto che sto rapidamente incontrando i suoi limiti? Qualche suggerimento di terze parti? Tutti quelli che ho provato sembrano terribilmente a pelle/a tema e mi è piaciuto lo stile del DGV in quanto si integra bene con altri controlli di WinForms. –

+0

Questo è esattamente ciò che intendevo, è un dolore. Impostare e.SuppressKeyPress e e.Handled su true se si utilizza il tasto, ho dimenticato di includerlo. Post aggiornato. –

+0

Grazie, ho provato il nuovo codice ma il problema è che i gestori di eventi Increment e Decrement non si attivano se la cella può essere modificata dall'utente.Se li metto in sola lettura, gli eventi si verificano, ma nel mio caso hanno bisogno di essere modificabili. Sembra che la cella che passa alla modalità di modifica venga eseguita prima del metodo OnKeyDown e impedisca che venga sempre eseguita. Nel mio caso, le celle dovrebbero essere modificate dagli utenti. Il metodo utilizzato nel mio commento sotto la risposta di Dave funziona, perché gli eventi del modulo si innescano prima di qualsiasi DGV, ma non è molto elegante come ho detto. Un modo per far funzionare il tuo? –

7

Hai provato con questo:

invece di utilizzare questo: Keys.OemMinus uso questo: Keys.Subtract

invece di utilizzare questo: Keys.Oemplus utilizzare questo: Keys.Add

+0

Si noti che potrebbe essere necessario controllare entrambi i set, sulla tastiera del mio Logitech K120 "Keys.Oemplus' e" Keys.OemMinus' sono per i tasti [+] e [-] sulla riga numerica, e "Keys.Add' e 'Keys.Subtract' sono per i tasti [+] e [-] sulla tastiera numerica. – jrh

Problemi correlati