C# Winforms DateTimePicker设置默认文本和/或值

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

我的winforms应用程序上有一个日期时间选择器,其ShowCheckBox=true。如果我在表单构造函数中执行此操作:

        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),它是不可见的。所以我认为应该有另一种方法,下面是我在最后所做的。顺便说一句,没有你的回答我是不会成功的,谢谢。