C#:DateTimePicker 在使用自定义格式的低宽度程序启动时有下拉显示错误。是什么原因造成的?

标签 c# winforms datetimepicker

DateTimePicker 的右侧有一个日历下拉按钮。通常它会显示一个小日历图标,但如果将控件的大小调整到图标与文本重叠的程度,它会变成一个更细的箭头下拉菜单。

问题:如果 DateTimePicker 在程序启动时低于该宽度,则下拉图标会非常宽并与文本重叠。水平调整窗口大小会修正宽度,之后会保持修正。

我想知道:

  1. 是什么原因造成的。
  2. 如何最好地修复它。

这是它的样子:

发布时

DateTimePicker Control on startup. The dropdown icon is too wide.

调整大小后

DateTimePicker Control after resizing. The dropdown icon is just right.

编辑#1:

这个显示问题似乎只在启动时发生。如果我根据用户输入添加新控件,它会正确显示:

Animation of DateTimePicker bug in action.

编辑#2:

我进一步缩小了导致问题的范围。它仅在以下情况下发生(在我的 PC 上,运行 Windows 8.1):

  • DateTimePicker.Format 设置为“自定义”。
  • 启动时 DateTimePicker 的宽度设置为 109 或更宽。
  • 控件的右边缘离格式化日期足够近,以至于它的图标向下折叠到箭头下拉列表。

如果我将控件的自定义格式设置为“MMMM d, yyyy”,我就会遇到问题。此格式设置与 DateTimePicker.Format 设置为“Long”时完全相同,但如果没有自定义格式,控件将正确显示。

最佳答案

作为Hans在上面的评论中指出:

It is just a plain bug, nothing you can do about it because it is baked into the OS.

这回答了问题的第一部分,意味着我们一直在努力解决它。这留下了几个选项:

  1. 在启动时使控件足够大。这要求您在布置表单时注意错误,但它很简单而且有效。
  2. 等到表单加载后添加控件,使用 Form.Load .此解决方案是一劳永逸的,但涉及修改表单对象本身,这可能不适用于所有人。

选项 2 很适合我的目的。代码看起来像这样:

public class EventForm : Form
{
    public EventForm()
    {
        this.Load += AddControls;
    }

    private void AddControls (object sender, EventArgs e)
    {
        DateTimePicker startDate = new DateTimePicker();
        startDate.Format = DateTimePickerFormat.Custom;
        startDate.CustomFormat = "MMM dd, yyyy — h:mm tt";
        startDate.Dock = DockStyle.Top;

        this.Controls.Add(startDate);
        // Add the rest of your controls here.
    }
}

我不确定这种方法是否有任何缺点,但我相信如果有的话我很快就会发现。

感谢其他答案和反馈。现在我要把这个标记为答案;希望它对以后的人有所帮助!

关于C#:DateTimePicker 在使用自定义格式的低宽度程序启动时有下拉显示错误。是什么原因造成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44830994/

相关文章:

javascript - 带有日期时间选择器的可编辑数据网格

c# - 将内联表值函数与 Linq 和 Entity Framework Core 结合使用

c# - 在缓存中找不到元素 - 也许页面在查找后已更改 c#

c# - 如何使用按钮单击在特定文本框中输入文本

c# - 如何像 DebugView 应用程序一样读取 c# Debug.WriteLine?

c# - 辅助轴标签不起作用?

c# - 使用 dateTimePicker 在 DataGridView 中编辑日期

c# - 如何将 'Convert' 类包装到通用函数中

c# - 按年份计算日期范围

jquery - 动态本地化 bootstrap-datetimepicker