Изменение цвета фона DateTimePicker в .NET.

В .NET (по крайней мере, в версии 2008 года и, возможно, в 2005 году), изменение свойства BackColor объекта DateTimePicker абсолютно не влияет на внешний вид. Как изменить цвет фона текстовой области, а не раскрывающегося календаря?

Изменить: Я говорил о формах Windows, а не ASP.

Ответ 1

Согласно MSDN:

Настройка BackColor не влияет на появление DateTimePicker.

Вам нужно написать настраиваемый элемент управления, который расширяет DateTimePicker. Переопределите свойство BackColor и метод WndProc.

Всякий раз, когда вы меняете BackColor, не забудьте вызвать метод myDTPicker.Invalidate(). Это заставит элемент управления перерисовываться с использованием указанного нового цвета.

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

Ответ 2

Существует свободная реализация, полученная из DateTimePicker, которая позволяет вам изменить свойство BackColor при изменении.

См. веб-сайт CodeProject: DateTimePicker с рабочим BackColor

Ответ 3

для текстовой области, которую вы бы сделали в фактическом текстовом поле, которое вы добавляете расширитель, на
для С# вы сделаете это следующим образом:

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

Ответ 4

Основываясь на этом CodeProject: DateTimePicker с рабочим BackColor (как опубликовано выше), я переписал собственный класс DatePicker (в VB.NET), который позволяет настраивать цвет фона, TextColor и маленькое изображение, появляющееся рядом с кнопкой раскрывающегося списка.

Eg.1:

enter image description here

Eg.2:

enter image description here

Чтобы заставить его работать, просто создайте новый класс в вашем проекте со следующим кодом и перестройте решение.
Новый элемент управления MyDateTimePicker должен появиться в списке инструментов:

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

* Обратите внимание, что этот класс упрощен, поэтому он имеет ограниченную функциональность.

Ответ 5

Этот календарь не имеет рамок. Такой код лучше добавить после рисования выпадающей кнопки для рисования фиксированного стиля с одной границей.

Dim p As New Pen(New SolidBrush(Me.CalendarTrailingForeColor))
g.DrawRectangle(p, 0, 0, ClientRectangle.Width - 1, ClientRectangle.Height - 1)
p.Dispose()