2008-10-13 15 views
11

In .NET (mindestens in der Version 2008 und vielleicht auch 2005) hat die Änderung der BackColor Eigenschaft einer DateTimePicker absolut keine Auswirkungen auf das Aussehen. Wie ändere ich die Hintergrundfarbe des Textbereichs, nicht des Dropdown-Kalenders?Ändern der Hintergrundfarbe eines DateTimePicker in .NET

Bearbeiten: Ich sprach über Windows-Formulare, nicht ASP.

Antwort

14

Nach MSDN:

Die Einstellung BackColor hat keine Auswirkung auf das Aussehen der DateTimePicker.

Sie müssen ein benutzerdefiniertes Steuerelement schreiben, das DateTimePicker erweitert. Überschreiben Sie die BackColor Eigenschaft und die WndProc Methode. Wenn Sie die BackColor ändern, vergessen Sie nicht, die myDTPicker.Invalidate() Methode aufzurufen. Dadurch wird das Steuerelement gezwungen, mit der neuen Farbe neu gezeichnet zu werden.

const int WM_ERASEBKGND = 0x14; 
protected override void WndProc(ref System.Windows.Forms.Message m) 
{ 
    if(m.Msg == WM_ERASEBKGND) 
    { 
     using(var g = Graphics.FromHdc(m.WParam)) 
     { 
      using(var b = new SolidBrush(_backColor)) 
      { 
       g.FillRectangle(b, ClientRectangle); 
      } 
     } 
     return; 
    } 

    base.WndProc(ref m); 
} 
+0

Es hat so lange gedauert, es zu akzeptieren. Ich hatte gehofft, es gäbe andere Lösungen, bei denen Hexwerte nicht bekannt wären, und dann vergaß ich es. –

+0

Vielen Dank für diesen Beitrag. Ich zeichne ein DateTimePicker-Steuerelement benutzerdefiniert und dies brachte mich in die richtige Richtung. –

+7

Ich habe diese Änderung unter Vista (mit und ohne visuelle Stile) versucht und es funktioniert nicht. –

2

für den Textbereich Sie auf dem tatsächlichen Textfeld tun würde, dass Sie den Extender auf
für C# Zugabe werden würden Sie es wie folgt tun:

<asp:TextBox runat="server" ID="txt" BackColor="Aqua" Text="Date"></asp:TextBox> 
+0

Es tut mir leid es so lange gedauert hat, um diese zu erhalten. Ich dachte, ich hätte diesen Kommentar bereits hinzugefügt. Ich sprach über Windows-Anwendungen, nicht über ASP-Anwendungen. –

3

Es ist eine freie Implementierung von DateTimePicker abgeleitet, die Sie BackColor Eigenschaft auf Änderung ändern.

Siehe Codeproject Webseite: DateTimePicker with working BackColor

+0

Das ist eine vollständig lobotomisierte Version, bei der Sie nur das Kalender-Dropdown verwenden können, um ein Datum auszuwählen. – Nyerguds

1

Basierend auf this project (wie oben geschrieben) Ich habe eine benutzerdefinierte Datepicker-Klasse neu geschrieben (in VB.NET), die ermöglicht, die Hintergrundfarbe besonders anfertigen, die Textfarbe und die kleine Bild erscheinen, neben dem Dropdown-Button.

Eg.1:

enter image description here

Eg.2:

enter image description here

Um es schafft funktioniert nur eine neue Klasse in Ihrem Projekt mit dem folgenden Code, und die Lösung neu erstellen . Eine neue Steuer genannt MyDateTimePicker sollte jetzt in der Toolbox Liste:

Public Class MyDateTimePicker 
    Inherits System.Windows.Forms.DateTimePicker 
    Private _disabled_back_color As Color 
    Private _image As Image 
    Private _text_color As Color = Color.Black 

    Public Sub New() 
     MyBase.New() 
     Me.SetStyle(ControlStyles.UserPaint, True) 
     _disabled_back_color = Color.FromKnownColor(KnownColor.Control) 
    End Sub 

    ''' <summary> 
    '''  Gets or sets the background color of the control 
    ''' </summary> 
    <Browsable(True)> 
    Public Overrides Property BackColor() As Color 
     Get 
      Return MyBase.BackColor 
     End Get 
     Set 
      MyBase.BackColor = Value 
     End Set 
    End Property 

    ''' <summary> 
    '''  Gets or sets the background color of the control when disabled 
    ''' </summary> 
    <Category("Appearance"), Description("The background color of the component when disabled")> 
    <Browsable(True)> 
    Public Property BackDisabledColor() As Color 
     Get 
      Return _disabled_back_color 
     End Get 
     Set 
      _disabled_back_color = Value 
     End Set 
    End Property 

    ''' <summary> 
    '''  Gets or sets the Image next to the dropdownbutton 
    ''' </summary> 
    <Category("Appearance"), 
    Description("Get or Set the small Image next to the dropdownbutton")> 
    Public Property Image() As Image 
     Get 
      Return _image 
     End Get 
     Set(ByVal Value As Image) 
      _image = Value 
      Invalidate() 
     End Set 
    End Property 

    ''' <summary> 
    '''  Gets or sets the text color when calendar is not visible 
    ''' </summary> 
    <Category("Appearance")> 
    Public Property TextColor As Color 
     Get 
      Return _text_color 
     End Get 
     Set(value As Color) 
      _text_color = value 
     End Set 
    End Property 


    Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) 
     Dim g As Graphics = Me.CreateGraphics() 
     g.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit 

     'Dropdownbutton rectangle 
     Dim ddb_rect As New Rectangle(ClientRectangle.Width - 17, 0, 17, ClientRectangle.Height) 
     'Background brush 
     Dim bb As Brush 

     Dim visual_state As ComboBoxState 

     'When enabled the brush is set to Backcolor, 
     'otherwise to color stored in _disabled_back_Color 
     If Me.Enabled Then 
      bb = New SolidBrush(Me.BackColor) 
      visual_state = ComboBoxState.Normal 
     Else 
      bb = New SolidBrush(Me._disabled_back_color) 
      visual_state = ComboBoxState.Disabled 
     End If 

     'Filling the background 
     g.FillRectangle(bb, 0, 0, ClientRectangle.Width, ClientRectangle.Height) 

     'Drawing the datetime text 
     g.DrawString(Me.Text, Me.Font, New SolidBrush(TextColor), 5, 2) 

     'Drawing icon 
     If Not _image Is Nothing Then 
      Dim im_rect As New Rectangle(ClientRectangle.Width - 40, 4, ClientRectangle.Height - 8, ClientRectangle.Height - 8) 
      g.DrawImage(_image, im_rect) 
     End If 

     'Drawing the dropdownbutton using ComboBoxRenderer 
     ComboBoxRenderer.DrawDropDownButton(g, ddb_rect, visual_state) 

     g.Dispose() 
     bb.Dispose() 
    End Sub 
End Class 

* Beachten Sie, dass diese Klasse vereinfacht ist, so hat es begrenzt functionallity

+0

Dies funktioniert, sogar in Windows 7. Aber es ändert Aussehen von DatetimePicker wegen Combobox. Gute Lösung. – LuckyLuke82

Verwandte Themen