【问题标题】:Winforms DateTimePicker set default text and/or valueWinforms DateTimePicker 设置默认文本和/或值
【发布时间】:2017-12-16 18:55:09
【问题描述】:

我的 winforms 应用程序上有一个带有 ShowCheckBox = true 的 DateTimePicker。如果我在表单构造函数中这样做:

        DateFrom.Checked = true;
        DateFrom.Value = DateTime.Today.AddDays(-7);

然后设置 DateFrom.Checked = false;在 FormShown 事件中,它做我想做的事,控件中的文本默认为今天前 7 天,并且复选框未选中。

如果我尝试仅设置值,则文本将保持为今天。如果我在 FormShown 事件之前的任何时候重置 Checked = false,则文本将保持为今天。

现在我已将此代码移至用户控件,因此要使用相同的“hack”将需要更多的 hack,所以在这一点上,我希望有人有更简单的方法。也许只是我可以设置的另一个属性,除了实际有效的 Value 吗? :)

我也试过这个:

        DateFrom.Text = DateTime.Today.ToString(DateFrom.CustomFormat);

而不是设置值,或者除此之外,都无济于事。

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    典型地,我在发布我的问题之前尝试了几个小时,然后在我认为它可能与窗口句柄的创建有关。所以我想出了这个解决方案。仍然会很高兴拥有更好的东西,但如果我必须坚持下去,这似乎还不错:

            DateFrom.Checked = true;
            DateFrom.Value = DateTime.Today.AddDays(-7);
            if (DateFrom.Handle == null)
                System.Threading.Thread.Sleep(0);
            DateFrom.Checked = false;
    

    检查句柄会强制创建窗口句柄,因此我可以取消选中控件,而不会在稍后创建窗口句柄时将文本默认为今天的日期。我只是使用 Sleep(0) 作为一个技巧,以确保编译器不会优化代码并将其全部编译出来(不确定这是否会发生,但想确定,并且条件不应该总是错误的所以无论如何都不应该 Sleep(0)。

    【讨论】:

    • == null 不起作用,因为 IntPtr 是 struct,您可以使用默认值,并且 sleep 始终无法访问,尽管调用句柄属性,调用 this.CreateHandle() 对我们来说是不可见的,由于保护级别(受保护)。所以我虽然应该有另一种方式,这就是我最后发布的内容。顺便说一句,如果没有你的回答,我不会成功,非常感谢。
    【解决方案2】:

    也可能是控件没有正确重绘,尤其是当您将它作为用户控件时。您可以在设置 Value 后尝试在控件上调用 Invalidate() 以查看是否是问题所在。

    【讨论】:

      【解决方案3】:

      我改变了你自己的答案,变成了这样:

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

      更新:

      其实一开始我也和你想的一样,但是做了这个之后,我试过了,发现Checked状态不会影响进程……所以可以简化为:

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

      【讨论】:

        猜你喜欢
        • 2011-01-10
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        • 2013-08-03
        • 2013-01-29
        • 2020-09-15
        • 1970-01-01
        相关资源
        最近更新 更多