2015-10-30 8 views
5

Ich überschreibe OnPaint-Methode in dem Ziel, Farbe in das Textfeld eines DateTimePicker Control und deaktivieren Sie die manuelle Eingabe in das Textfeld?Warum DateTimePicker BackColor Manuelle Eingabe deaktivieren?

haben Sie einige Ideen, um dieses Problem zu lösen?

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; } 
    } 

} 

Ich gebe mehr Details „Manuelle Eingabe von“ betreffend: Es ist, wenn Sie mit der Tabulatortaste drücken und gehen Sie auf dem Datetimepicker. Dann können Sie mit Ihrer Tastatur ein neues Datum eingeben.

wie folgt aus:

enter image description here

+0

rufen Sie alle die überschriebene OnPaint-Methode? Vielleicht solltest du diese Methode lieber für das Hintergrundbild überprüfen? https://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaintbackground%28v=vs.110%29.aspx – Icepickle

+0

Versuchen Sie, Hilfe zu erhalten von: http://www.codeproject.com/Articles/30660/A-DateTimePicker-with-working-BackColor und http://stackoverflow.com/questions/1595481/datetimepicker-and -userpaint-text-and-button-missing – ehh

+0

Ich benutze den Link von Codeproject, um meinen Code zu machen. Ich versuche nur mit dem Hintergrundbild, aber es funktioniert nicht. – Julien698

Antwort

3

Tastatureingabe war nicht deaktiviert, Hervorhebung Fähigkeit war, wegen Ihrer simplen OnPaint Umsetzung. Am Anfang haben wir:

enter image description here

Und dann die Kontrolle klicken Fokus und Typisierung zu gewinnen, sagen wir mal, "1776.07.04" (WICHTIG: Schrägstriche enthalten), erhalten wir:

enter image description here

und schließlich die Drop-Down-Taste Auswahl, nur um zu bestätigen:

enter image description here

Dies ist der Code:

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; } 
    } 
} 

Die Form enthält eine regelmäßige DateTimePicker und BCDateTimePicker, mit dem grünen Hintergrund (Set durch VS-Designer).

So funktioniert es wie erwartet. Das Textfeld wird sogar dynamisch aktualisiert, wenn das Datum eingegeben wird.

EDIT 1: Das GIF war zu groß, so zum Hochladen auf:

See animated GIF here

EDIT 2: Hinweis über ControlStyles.UserPaint - MSDN

Wenn wahr, die Steuerfarben und nicht das Betriebssystem. Wenn false ist, wird das Paint-Ereignis nicht ausgelöst. Dieser Stil gilt nur für von Control abgeleitete Klassen.

Beachten Sie, dass BCDateTimePicker seine Edit-Highlighting-Funktion verloren ging. Das liegt daran, dass Ihre Implementierung von OnPaint weitaus simpler ist als das Betriebssystem. Die Tastatureingabe wurde jedoch nicht deaktiviert und ist weiterhin funktionsbereit.