我有一个DateTimePicker(可空版本),我需要只读。如果它被禁用,我对显示器不满意,所以想知道是否有人有一个如何停止现场更新的漂亮例子?
感谢。
答案 0 :(得分:9)
您可以挂钩Changed事件,并将值设置回所需的值(如果不同) - 这样您就可以覆盖任何更改原因(通过鼠标或键盘)
您是否考虑使用其他控件,例如只读文本框甚至是标签控件?
答案 1 :(得分:8)
我知道这已经很老了,但是为了帮助其他人搜索这个(因为这是我通过谷歌找到的第一个)你可以使用:
this.dateTimePicker1.Enabled = false;
使其行为与文本框与this.textbox1.ReadOnly = true
答案 2 :(得分:3)
这个问题 - 六年后 - 似乎仍然引起了一些兴趣所以我会投入我的2美分:对我有用的是1)创建一个UserControl并将基类更改为DateTimePicker 2)拿一点每当值更改时控件的位图快照3)拦截WM_PAINT消息,如果我们的控件被禁用,则绘制位图而不是控件。 (注意:designer.cs中的AutoScaleMode属性会导致编译错误,因此只需删除)
public partial class DateTimePickerWithReadOnly : DateTimePicker
{
Bitmap ReadOnlyImage;
// We maintain a "shadow" control to avoid capturing selections in the snapshot.
// If you use different formatting or styles just make sure the shadow is set to match!
DateTimePicker Shadow = new DateTimePicker();
public DateTimePickerWithReadOnly()
{
InitializeComponent();
CaptureBitmap();
this.ValueChanged += new EventHandler(DateTimePickerWithReadOnly_ValueChanged);
}
private void CaptureBitmap()
{
Shadow.Value = Value;
Shadow.Size = Size;
ReadOnlyImage = new Bitmap(Width, Height);
Shadow.DrawToBitmap(ReadOnlyImage, new Rectangle(0, 0, Size.Width, Size.Height));
}
void DateTimePickerWithReadOnly_ValueChanged(object sender, EventArgs e)
{
CaptureBitmap();
}
protected override void DefWndProc(ref Message m)
{
base.DefWndProc(ref m);
// WM_PAINT is 0x000F
if ((m.Msg == 0x000F) && !Enabled)
{
Graphics g = base.CreateGraphics();
g.DrawImage(ReadOnlyImage, new Rectangle(0, 0, Size.Width, Size.Height));
g.Dispose();
}
}
}
答案 3 :(得分:1)
“如果显示器被禁用,我对显示器不满意”
为什么呢?如果是因为禁用的文本框看起来很奇怪,您只需更改禁用的样式以使其看起来正常,或者以更漂亮的方式指示它仅通过日期选择器接受输入。可能没有边框,说它不是一个真正的文本框。
答案 4 :(得分:1)
按键按下:e.SuppressKeyPress = true;为我工作,仍然可以选择日期,但不能手动输入
答案 5 :(得分:0)
处理DateTimePicker.MouseClick事件并将event.handled设置为true
答案 6 :(得分:0)
如何选择Changed事件并设置e.Cancel = true?
答案 7 :(得分:0)
这不是最好的方法,但这会通过keyUp停止更新datetime
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private DateTime originalValue;
private void dateTimePicker1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
originalValue = dateTimePicker1.Value;
}
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
dateTimePicker1.Value = originalValue;
}
}
答案 8 :(得分:0)
我们首先要记住原始日期时间。
procedure TForm1.dtpDateEnter(Sender: TObject);
begin
oldDtpDate := dtpDate.DateTime;
end;
程序TForm1.dtpDateClick(Sender:TObject); 开始 dtpDate.DateTime:= oldDtpDate; 端;
procedure TForm1.dtpDateExit(Sender: TObject);
begin
dtpDate.DateTime := oldDtpDate;
end;
答案 9 :(得分:0)
我这样做的一种方法是简单地将允许的日期范围限制为单个值。
dateTimePicker.MinDate = dateTimePicker.Value;
dateTimePicker.MaxDate = dateTimePicker.Value;
答案 10 :(得分:0)
作为另一建议:使用文本框(或标签)并将其设置为只读。显示所需的值。
如果必须有一个datetimepicker,请同时创建一个datetimepicker和一个文本框。将它们彼此叠放。当需要datetimepicker时,隐藏文本框。等等
答案 11 :(得分:0)
我知道它已经过时了多年,但是我讨厌找到仍然没有解决方案的相关问题。顺便说一句,您可能不希望禁用它的原因是,您无法轻松显示工具提示和自定义背景色(尽管可以更轻松地解决此问题)
无论如何,我找到了我认为该问题要求的解决方案(感谢其他地方的人)。我已经有一个DateTimePicker的自定义控件。
然后我添加了一个Readonly属性。我的问题出在VB.Net项目中
重写KeyDown事件,如果Readonly = True,则将其标记为已处理。
Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
If mReadOnly Then
e.Handled = True
Else
MyBase.OnKeyDown(e)
End If
End Sub
这需要照顾箭头键和F4下拉键。
然后禁用该下拉列表,请重写WndProc方法:
Protected Overrides Sub WndProc(ByRef m As Message)
' m.Msg = 0x201 / &H201 = WM_LBUTTONDOWN
' m.Msg = 0x203 / &H203 = WM_LBUTTONDBLCLK
If ReadOnly And (m.Msg = &H201 Or m.Msg = &H203) Then
Return
End If
MyBase.WndProc(m)
End Sub
要使其在我的OnPaint覆盖中显示为只读,请执行以下操作:
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim g As Graphics = Me.CreateGraphics()
Dim dropDownIcon As Rectangle = New Rectangle(ClientRectangle.Width - 17, 0, 17, ClientRectangle.Height)
Dim b As Brush
Dim v As VisualStyles.ComboBoxState
Dim vn As ButtonState
b = New SolidBrush(Me.BackColor)
If Me.IsReadOnly Then
v = VisualStyles.ComboBoxState.Disabled
vn = ButtonState.Inactive
Else
b = New SolidBrush(Me.BackColor)
v = VisualStyles.ComboBoxState.Normal
vn = ButtonState.Normal
End If
'changed to only do this if the control is visible
If Me.Visible = True Then
'colour rectangle
g.FillRectangle(b, 0, 0, ClientRectangle.Width, ClientRectangle.Height)
'for border
g.DrawRectangle(System.Drawing.SystemPens.ActiveBorder, 0, 0, ClientRectangle.Width - 1, ClientRectangle.Height - 1)
'for text
g.DrawString(Me.Text, Me.Font, New SolidBrush(Me.ForeColor), 0, 2)
'we need to render the dropdown when visual styles is not turned on
If ComboBoxRenderer.IsSupported Then
ComboBoxRenderer.DrawDropDownButton(g, dropDownIcon, v)
Else
ControlPaint.DrawComboButton(g, dropDownIcon, vn)
End If
End If
g.Dispose()
b.Dispose()
End Sub
答案 12 :(得分:0)
this.dateTimePicker1.Enabled = false;
这是一种简单而完美的解决方案。
答案 13 :(得分:-1)
dateTimePicker2.Enabled = false;
答案 14 :(得分:-3)
试试这个:
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
dateTimePicker1.Value = DateTime.Now;
}