winforms 如何在面板顶部显示MonthCalendar控件?

kknvjkwl  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(151)

如何在顶部显示类似于DateTimePicker下拉列表的MonthCalendar?我有一个自定义控件(TextBoxButton),当单击时,它会动态显示MonthCalendar
我可以把它放在控制面板的前面,但不能放在面板的上面。

private void btn_Click(object sender, EventArgs e)
{
       if (mc.Parent == null)
       {
            this.Parent.Controls.Add(mc);
            mc.Location = new Point(this.Location.X, this.Location.Y + this.Height);
            mc.BringToFront();
        }
        else
        {
            mc.Show();
        }
}

8zzbczxx

8zzbczxx1#

DateTimePicker上的下拉日历是一个浮动窗口,ComboBox上的下拉列表也是如此。MonthCalendar只是一个常规控件,因此,就像其他任何控件一样,它不能显示在其父控件的边界之外。如果您希望它显示在窗体上,并且超出Panel的边界,那么您需要使其父控件成为窗体。而不是Panel。如果您希望它也显示在窗体边界之外,则需要创建一个新的无边框窗体,并将其作为控件的父控件。
以下是一种方法,可用于将子控件从一个父控件移动到另一个父控件,而不更改其在屏幕上的绝对位置:

/// <summary>
/// Moves a child control from its current parent to a new parent while maintaining the same absolute location.
/// </summary>
/// <param name="child">
/// The child control to move.
/// </param>
/// <param name="newParent">
/// The new parent to move the child control to.
/// </param>
private void ChangeParent(Control child, Control newParent)
{
    var screenLocation = child.PointToScreen(Point.Empty);

    child.Parent = null;
    child.Location = newParent.PointToClient(screenLocation);
    child.Parent = newParent;
}

在您的情况下,您可能希望这样调用它:

ChangeParent(mc, this);

之后,您可能需要在子控件上呼叫BringToFront,视您的迭置顺序而定。
请注意,您也可以在设计工具中将MonthCalendar加入至表单,然后在属性 windows 中变更其Location,以将其置于正确的位置。

相关问题