为什么DateTimePicker BackColor禁用手动输入?

Jul*_*698 5 c# textbox datetimepicker winforms

我重写OnPaint方法,目的是将颜色放在DateTimePicker控件的文本框中,并禁用文本框中的手动输入?

你有什么想法来解决这个问题吗?

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

}
Run Code Online (Sandbox Code Playgroud)

我提供了有关"手动输入"的更多详细信息:当您按Tab键并继续使用DateTimePicker时.然后,您可以使用键盘输入新日期.

像那样 :

在此输入图像描述

jsa*_*ics 3

由于您的实现过于简单,键盘输入未被禁用,突出显示功能被禁用OnPaint。最初我们有:

在此输入图像描述

然后单击控件获得焦点并输入“07/04/1776”(重要提示:包括反斜杠),我们得到:

在此输入图像描述

最后,选择下拉按钮,只是为了确认:

在此输入图像描述

这是代码:

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

包含Form一个常规的DateTimePicker和一个BCDateTimePicker, 具有绿色背景(通过 VS Designer 设置)。

所以,它按预期工作。文本框甚至会随着日期的输入而动态更新。

编辑 1:这个 GIF 太大,无法上传:

在这里查看动画 GIF

编辑2:关于ControlStyles.UserPaint的注释-MSDN

如果为true,则控件会自行绘制,而不是操作系统进行绘制。如果为false,则不会引发 Paint 事件。此样式仅适用于从 Control 派生的类。

请注意,BCDateTimePicker失去了文本框编辑突出显示功能。这是因为您的实现OnPaint比操作系统的实现要简单得多。但键盘输入并未被禁用并且仍然可以使用。