DateTimePicker日历按钮宽度

时间:2012-11-26 00:02:58

标签: c# winforms datetimepicker

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

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

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

我可以尝试使用反射来读取/写入私有字段,但我不知道要阅读什么..

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

2 个答案:

答案 0 :(得分:1)

我自己找到了一种方式.. =)..当控件宽于显示的文本时,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本身的位置.. =)..符合我的目的.. =)

答案 1 :(得分:0)

无需重新发明轮子。看看这个:

Nullable DateTimePicker on CodeProject

和这一个:

Yet another nullable DateTimePicker control

enter image description here