2008-10-13 3 views
11

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

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

ответ

14

По MSDN:

Установка BackColor не влияет на внешний вид DateTimePicker.

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

Всякий раз, когда вы меняете 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); 
} 
+0

Жаль, что так долго не принималось. Я надеялся, что есть другие решения, которые не предполагали знание шестнадцатеричных значений, а затем я забыл об этом. – 2009-01-05 18:47:11

+0

Спасибо за сообщение. Я настраиваю элемент управления DateTimePicker, и это ставит меня в правильном направлении. – 2009-02-13 22:33:37

+7

Я пробовал это изменение под Vista (с визуальными стилями и без них), и он не работает. – 2009-02-16 05:53:12

2

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

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

Я сожалею, что это заняло так много времени, чтобы добраться до этого. Я думал, что уже добавил этот комментарий. Я говорил о приложениях Windows, а не о приложениях ASP. – 2009-01-05 18:45:13

3

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

Смотрите сайт CodeProject: DateTimePicker with working BackColor

1

Основываясь на this project (как писал выше) Я переписан пользовательский класс 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 

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

Смежные вопросы