2015-10-30 31 views
5

Sovrascrivo il metodo OnPaint nell'obiettivo di mettere il colore nella casella di testo di un controllo DateTimePicker e disabilita la digitazione manuale nella casella di testo?Perché DateTimePicker BackColor Disabilita la digitazione manuale?

avete qualche idea per risolvere questo problema?

public class BCDateTimePicker : DateTimePicker 
{ 
    public BCDateTimePicker() 
    { 
     this.SetStyle(ControlStyles.UserPaint, true); 
    } 

    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) 
    { 
     Graphics g = this.CreateGraphics(); 
     Rectangle dropDownRectangle = new Rectangle(ClientRectangle.Width - 20, 0, 20, 20); 
     Brush bkgBrush; 
     ComboBoxState visualState; 
     if (this.Enabled) 
     { 
      bkgBrush = new SolidBrush(this.BackColor); 
      visualState = ComboBoxState.Normal; 
     } 
     else 
     { 
      bkgBrush = new SolidBrush(this.BackColor); 
      visualState = ComboBoxState.Disabled; 
     } 
     g.FillRectangle(bkgBrush, 0, 0, ClientRectangle.Width, ClientRectangle.Height); 
     g.DrawString(this.Text, this.Font, Brushes.Black, 0, 2); 
     ComboBoxRenderer.DrawDropDownButton(g, dropDownRectangle, visualState); 

     g.Dispose(); 
     bkgBrush.Dispose(); 
    } 

    [Browsable(true), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    public override Color BackColor 
    { 
     get { return base.BackColor; } 
     set { base.BackColor = value; } 
    } 

} 

Ho dare maggiori dettagli riguardanti "digitazione manuale": E 'quando si preme TAB e si va sul DateTimePicker. Quindi puoi inserire una nuova data usando la tastiera.

Come quella:

enter image description here

+0

chiamate ogni metodo OnPaint sottoposto a override? Forse dovresti controllare questo metodo per il background painting? https://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaintbackground%28v=vs.110%29.aspx – Icepickle

+0

Cercare di ottenere aiuto da: http://www.codeproject.com/Articles/30660/A-DateTimePicker-with-working-BackColor e http://stackoverflow.com/questions/1595481/datetimepicker-and -userpaint-text-and-button-missing – ehh

+0

Io uso il link da codeproject per fare il mio codice. Cerco solo di dipingere sullo sfondo ma non funziona. – Julien698

risposta

3

input da tastiera non è stato disattivato, mettendo in evidenza la capacità era, a causa della vostra semplicistico OnPaint implementazione. Inizialmente abbiamo:

enter image description here

E poi clic sul controllo per ottenere l'attenzione e digitando, diciamo, "1776/07/04" (IMPORTANTE: backslash inclusi), otteniamo:

enter image description here

e, infine, la selezione del pulsante a discesa, solo per confermare:

enter image description here

Questo è il codice:

public class BCDateTimePicker : DateTimePicker 
{ 
    public BCDateTimePicker() 
    { 
     this.SetStyle(ControlStyles.UserPaint, true); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     Graphics g = this.CreateGraphics(); 

     Rectangle dropDownRectangle = new Rectangle(ClientRectangle.Width - 20, 0, 20, 20); 
     Brush bkgBrush; 
     ComboBoxState visualState; 
     if (this.Enabled) 
     { 
      bkgBrush = new SolidBrush(this.BackColor); 
      visualState = ComboBoxState.Normal; 
     } 
     else 
     { 
      bkgBrush = new SolidBrush(this.BackColor); 
      visualState = ComboBoxState.Disabled; 
     } 
     g.FillRectangle(bkgBrush, 0, 0, ClientRectangle.Width, ClientRectangle.Height); 
     g.DrawString(this.Text, this.Font, Brushes.Black, 0, 2); 
     ComboBoxRenderer.DrawDropDownButton(g, dropDownRectangle, visualState); 

     g.Dispose(); 
     bkgBrush.Dispose(); 
    } 

    [Browsable(true), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    public override Color BackColor 
    { 
     get { return base.BackColor; } 
     set { base.BackColor = value; } 
    } 
} 

Il Form contiene un regolare DateTimePicker e un BCDateTimePicker, con lo sfondo verde (impostato tramite VS Designer).

Quindi, funziona come previsto. La casella di testo si aggiorna anche in modo dinamico mentre si digita la data.

EDIT 1: Questo GIF era troppo grande per essere caricato su SO:

See animated GIF here

EDIT 2: Nota sui ControlStyles.UserPaint - MSDN

If veri, le vernici di controllo stesso piuttosto che il sistema operativo che lo fa. Se false, l'evento Paint non viene generato. Questo stile si applica solo alle classi derivate da Control.

Si noti che BCDateTimePicker ha perso la capacità di modifica delle aree di testo. Questo perché la tua implementazione di OnPaint è molto più semplice di quanto viene fatto dal sistema operativo. Ma l'input da tastiera non è stato disabilitato ed è ancora operativo.