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时.然后,您可以使用键盘输入新日期.
像那样 :
由于您的实现过于简单,键盘输入未被禁用,突出显示功能被禁用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 太大,无法上传:
编辑2:关于ControlStyles.UserPaint的注释-MSDN
如果为true,则控件会自行绘制,而不是操作系统进行绘制。如果为false,则不会引发 Paint 事件。此样式仅适用于从 Control 派生的类。
请注意,BCDateTimePicker失去了文本框编辑突出显示功能。这是因为您的实现OnPaint比操作系统的实现要简单得多。但键盘输入并未被禁用并且仍然可以使用。
| 归档时间: |
|
| 查看次数: |
991 次 |
| 最近记录: |