c# - DateTimePicker 日历按钮宽度

标签 c# winforms datetimepicker

我试图创建一个可为空的 DateTimePicker,当控件被标记为具有空日期时,它可以选择显示一些提示文本。为了实现此目的,我继承自 DateTimePicker 并添加了一个带有覆盖文本部分的提示文本的 Label 控件当控件被标记为具有空日期时..问题是,如果 DateTimePicker 设置为显示通常的日历图标,则此按钮的宽度是可变的..

下图显示了具有不同大小的相同 DateTimePicker 控件。一旦日历图标按钮开始与文本重叠,它就会更改为更小的、简单的下拉图标按钮。

enter image description here enter image description here enter image description here enter image description here

我可以尝试使用反射来读/写私有(private)字段,但我不知道读什么......

我的问题..如何找到正确显示在 DateTimePicker 控件中的日历图标的宽度..

最佳答案

我自己找到了一种方法.. =).. 当控件比显示的文本宽时,DateTimePicker 显示日历图标按钮.. 当按钮开始剪辑文本时,控件自动回退到显示较小的下拉按钮(在原始问题的图像的第二行中可见)..因此我们找出文本的宽度,日历图标按钮,下拉按钮和控件本身..接下来的数学很简单..

const int C_BUTTONICON_WIDTH = 34;
const int C_BUTTONARROW_WIDTH = 17;

protected int GetLabelWidth()
{
    int iControlW = this.Width;
    int iTextW = TextRenderer.MeasureString(this.Text, this.Font).Width;

    int iLabelW = 0;
    if (iTextW <= iControlW - C_BUTTONICON_WIDTH)
    {
        iLabelW = iControlW - C_BUTTONICON_WIDTH;
    }
    else
    {
        iLabelW = iControlW - C_BUTTONARROW_WIDTH;
    }
    return iLabelW;
}

您可能需要根据 Label 本身的位置调整一些像素.. =).. 达到了我的目的.. =)

关于c# - DateTimePicker 日历按钮宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13556960/

相关文章:

c# - 如何在 tableLayoutPanel 中设置 columnspan

jquery - 如何将完整日历日期添加到动态文本框

c# - DateTimePicker 不使用自定义格式字符串

jquery - 我找到的这个随机 Datetimepicker 插件的最小日期和时间设置是什么?

c# - self 更新、下载、解压和替换 Exe

c# - 如何使用 C# 打开谷歌浏览器窗口(仅页面)

c# - 如何从列表中获取不同的数据?

c# - 在 C# 中将文件复制到剪贴板

c# - 如何在具有 View 样式 View.SmallIcon 的 Winforms ListView 中将列设置为固定大小

c# - C#中的抽象类构造函数