C# Winforms DateTimePicker设置默认文本和/或值
我的winforms应用程序上有一个日期时间选择器,其ShowCheckBox=true。如果我在表单构造函数中执行此操作:C# Winforms DateTimePicker设置默认文本和/或值,c#,.net,winforms,C#,.net,Winforms,我的winforms应用程序上有一个日期时间选择器,其ShowCheckBox=true。如果我在表单构造函数中执行此操作: DateFrom.Checked = true; DateFrom.Value = DateTime.Today.AddDays(-7); 然后设置DateFrom.Checked=false;在FormShowed事件中,它执行我想要的操作,控件中的文本默认为7天前,并且复选框未选中 如果我尝试只设置值,文本将保持今天的状态。如果我在F
DateFrom.Checked = true;
DateFrom.Value = DateTime.Today.AddDays(-7);
然后设置DateFrom.Checked=false;在FormShowed事件中,它执行我想要的操作,控件中的文本默认为7天前,并且复选框未选中
如果我尝试只设置值,文本将保持今天的状态。如果我在FormShowed事件之前的任何时候重置Checked=false,文本将保持今天的状态
现在我把这段代码移到了一个用户控件上,所以使用同样的“黑客”需要更多的黑客,所以在这一点上,我希望有人有一个更简单的方法。也许除了实际工作的值之外,我还可以设置另一个属性?:)
我也试过:
DateFrom.Text = DateTime.Today.ToString(DateFrom.CustomFormat);
没有设置值,或者除了设置值之外,没有任何效果。典型的情况是,我在发布问题之前尝试了几个小时,然后就在我认为它可能与创建窗口句柄有关之后。所以我想出了这个解决方案。我仍然会很高兴有更好的东西,但如果我必须坚持下去,这似乎并不坏:
DateFrom.Checked = true;
DateFrom.Value = DateTime.Today.AddDays(-7);
if (DateFrom.Handle == null)
System.Threading.Thread.Sleep(0);
DateFrom.Checked = false;
选中句柄将强制创建窗口句柄,这样我就可以取消选中控件,而不会在稍后创建窗口句柄时将文本默认为今天的日期。我只是使用睡眠(0)作为一种技巧,以确保编译器不会优化代码并将其全部编译出来(不确定是否会发生这种情况,但希望确定,条件不应该总是错误的,因此无论如何都不应该睡眠(0)。典型的情况是,我在发布问题之前尝试了几个小时,然后就在我认为它可能与窗口句柄的创建有关之后。所以我想出了这个解决方案。我仍然会很高兴有更好的东西,但如果我必须坚持下去,这似乎并不坏:
DateFrom.Checked = true;
DateFrom.Value = DateTime.Today.AddDays(-7);
if (DateFrom.Handle == null)
System.Threading.Thread.Sleep(0);
DateFrom.Checked = false;
选中句柄将强制创建窗口句柄,这样我就可以取消选中控件,而不会在稍后创建窗口句柄时将文本默认为今天的日期。我只是使用Sleep(0)作为一种技巧,以确保编译器不会优化代码并将其全部编译出来(不确定是否会发生这种情况,但希望确定,并且条件不应始终为false,因此无论如何都不应使用Sleep(0)。也可能是控件没有正确地重新绘制,尤其是当您将其作为用户控件时。在设置值后,您可以尝试对控件调用Invalidate(),以确定这是否是问题所在。也可能是该控件没有正确地重新绘制,特别是当您将其作为用户控件时。设置值后,您可以尝试在控件上调用Invalidate(),看看这是否是问题所在。我更改了您的自我回答,并将其设置为:
public ProcessFailureForm()
{
InitializeComponent();
//Blah blah blah
dtFrom.HandleCreated += delegate //if you need sender or EventArgs use: delegate(object sender, EventArgs e)
{
dtFrom.Checked = true;
dtFrom.Value = DateTime.Today.AddDays(-7);
dtFrom.Checked = false;
};
}
更新: 实际上,首先我和你一样认为,但在这样做之后,我尝试并发现检查状态不会影响流程。。。因此,它可以简化为:
public ProcessFailureForm()
{
InitializeComponent();
//Blah blah blah
dtFrom.HandleCreated += delegate //if you need sender or EventArgs use: delegate(object sender, EventArgs e)
{
dtFrom.Value = DateTime.Today.AddDays(-7);
};
}
我改变了你的自我回答,让它变成这样:
public ProcessFailureForm()
{
InitializeComponent();
//Blah blah blah
dtFrom.HandleCreated += delegate //if you need sender or EventArgs use: delegate(object sender, EventArgs e)
{
dtFrom.Checked = true;
dtFrom.Value = DateTime.Today.AddDays(-7);
dtFrom.Checked = false;
};
}
更新: 实际上,首先我和你一样认为,但在这样做之后,我尝试并发现检查状态不会影响流程。。。因此,它可以简化为:
public ProcessFailureForm()
{
InitializeComponent();
//Blah blah blah
dtFrom.HandleCreated += delegate //if you need sender or EventArgs use: delegate(object sender, EventArgs e)
{
dtFrom.Value = DateTime.Today.AddDays(-7);
};
}
==null
不起作用,因为IntPtr是struct,您可以使用默认值,并且睡眠总是不可访问的,尽管调用句柄属性,调用this.CreateHandle()
,由于保护级别(protected),我们无法看到它。所以我认为应该有另一种方法,下面是我在最后所做的。顺便说一句,没有你的回答我是不会成功的,非常感谢。==null
不起作用,因为IntPtr是struct,你可以使用默认值,并且睡眠总是不可访问的,尽管调用句柄属性,调用this.CreateHandle()
,由于保护级别(protected),它是不可见的。所以我认为应该有另一种方法,下面是我在最后所做的。顺便说一句,没有你的回答我是不会成功的,谢谢。