2010-02-23 16 views
6

Nel mio progetto c'è un controllo utente che include un Ctrl NumericUpDown, e il suo campo di valori valido è da 10 a 100,Come mantenere il valore non valido per NumericUpDown dopo aver perso lo stato attivo?

quindi se gli input dell'utente 200 in NumericUpDown Ctrl, quindi il suo valore sarà cambiato in 100 automaticamente dopo il focus è cambiato in altri ctrl, sembra un po 'curioso per il cliente, perché possono cliccare il pulsante OK dopo l'input 200 in NumericUpDown ctrl, hanno bisogno di una finestra di messaggio che indichi loro che il valore che hanno inserito non è compreso nell'intervallo.

Ma la domanda è il valore per NumericUpDown cambierà automaticamente dopo che lo stato attivo è cambiato se il valore inserito è fuori dal suo intervallo.

Quindi, come implementarlo?

Sameh Serag, questo è il codice che ho testato. Ho aggiunto un pulsante nel modulo ma non ho fatto nulla. Il risultato per me è dopo l'input 200 e clic sul pulsante, viene mostrata solo una messagebox con valore 100. Dopo aver immesso 200 e premuto il tasto tab, verrà visualizzato solo un messaggio con il valore 200 e il valore del testo in NumericUpDown verrà modificato a 100. Così curioso :-) Comunque grazie mille per il tuo aiuto! A proposito, la versione del framework .Net è 2.0 con sp2 per me.

public partial class Form1 : Form 
{ 
    private TextBox txt; 

    public Form1() 
    { 
     InitializeComponent(); 

     txt = (TextBox)numericUpDown1.Controls[1]; 
     txt.Validating += new CancelEventHandler(txt_Validating); 
    } 

    void txt_Validating(object sender, CancelEventArgs e) 
    { 
     MessageBox.Show(txt.Text); 
    } 
} 
+2

Non credo che questo sia possibile, ma uno perché è un problema che ho colpito in passato troppo. Ho finito per tornare ai vecchi vecchi TextBox. –

+0

+1 a Matt.I controlli NumericUpDown sono i controlli più disgustosi mai concepiti. Non ho mai osservato un utente in realtà facendo clic su quei piccoli pulsanti o usando i tasti freccia. Si limitano a digitare. E Dio ti aiuta se sei su un tablet. – Josh

+0

@Carlos_Liu: Ho aggiornato la mia risposta di seguito dopo la modifica alla domanda. A proposito: ha funzionato per me in tutti gli scenari che hai descritto sopra. Provalo e facci sapere i risultati ;-) –

risposta

13

Il trucco è quello di inserire la casella di testo incorporata nel controllo di aggiornamento numerico e gestirne l'evento di convalida.

Ecco come farlo fare:

Creat una forma manichino e aggiungere un controllo UpDown numerica e alcuni altri controlli, e quando il controllo unpdown numerica perde il focus, il testo del modulo verrà impostato su il valore che l'utente ha inserito.

Qui il codice di quello che ho fatto:

public partial class Form1 : Form 
    { 
     TextBox txt; 
     public Form1() 
     { 
      InitializeComponent(); 
      txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control 
      txt.Validating += new CancelEventHandler(txt_Validating); 
     } 
     void txt_Validating(object sender, CancelEventArgs e) 
     { 
      this.Text = txt.Text; 
     } 
    } 

EDIT:

@Carlos_Liu: Ok, posso vedere ora il problema, è possibile raggiungere questo obiettivo con la Evento TextChanged, basta salvare il valore in una variabile dummy e riutilizzarlo in txt_Validating, ma sii cauto, non aggiornare questa variabile a meno che la casella di testo sia focalizzata.

Ecco il nuovo codice di esempio:

public partial class Form1 : Form 
{ 
    TextBox txt; 
    string val; 
    public Form1() 
    { 
     InitializeComponent(); 
     txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control 
     txt.TextChanged += new EventHandler(txt_TextChanged); 
     txt.Validating += new CancelEventHandler(txt_Validating); 
    } 

    void txt_TextChanged(object sender, EventArgs e) 
    { 
     if (txt.Focused) //don't save the value unless the textbox is focused, this is the new trick 
      val = txt.Text; 
    } 
    void txt_Validating(object sender, CancelEventArgs e) 
    { 
     MessageBox.Show("Val: " + val); 
    } 
} 

EDIT # 2

@Carlos_Liu: Se è necessario il valore inserito deve essere mantenuto, ancora c'è un trucco per fare quindi: @ l'evento Validating della casella di testo, controlla il valore, se non è compreso nell'intervallo, annulla lo stato attivo!

Ecco una nuova versione del codice:

public partial class Form1 : Form 
{ 
    TextBox txt; 
    string val; 
    public Form1() 
    { 
     InitializeComponent(); 
     txt = (TextBox)numericUpDown1.Controls[1]; 
     txt.TextChanged += new EventHandler(txt_TextChanged); 
     txt.Validating += new CancelEventHandler(txt_Validating); 
    } 

    void txt_TextChanged(object sender, EventArgs e) 
    { 
     if (txt.Focused) 
      val = txt.Text; 
    } 
    void txt_Validating(object sender, CancelEventArgs e) 
    { 
     int enteredVal = 0; 
     int.TryParse(val, out enteredVal); 
     if (enteredVal > numericUpDown1.Maximum || enteredVal < numericUpDown1.Minimum) 
     { 
      txt.Text = val; 
      e.Cancel = true; 
     } 
    } 
} 
+0

Sembra che la dose non funzioni perché quando si immette l'evento di convalida della casella di testo, il valore è stato interrotto in base al valore di NumericUpDown min/valore massimo –

+0

No, funziona per me. Assicurati di gestire l'evento ** Validating ** e ** Validated **. Provalo semplicemente da solo, quindi incorporalo nel tuo progetto. –

+0

Hai provato a inserire un valore superiore al valore massimo di numericUpDown1? Supponiamo che il valore massimo di NumericUpDown1 è 100, se si immette 200, quindi txt_Validating viene attivato dopo NumericUpDown1 perdere la concentrazione, e si può popup il testo del txt come dopo ### vuoto txt_Validating (object sender, CancelEventArgs e) { MessageBox.Show (txt.Text); } ### vedrete il suo valore è già stato tagliato a 100 –

Problemi correlati