You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让MonthCalendar控件显示在Panel上方,实现类似DateTimePicker下拉效果?

实现MonthCalendar控件置顶覆盖Panel的效果

你的问题核心是MonthCalendar被Panel的裁剪特性限制,无法超出Panel边界显示——因为你把它添加到了Panel(this.Parent)中,而Panel默认开启ClipChildren=true,会将子控件裁剪到自身范围内。以下两种方案可以实现类似DateTimePicker的置顶下拉效果:

方案一:将MonthCalendar添加到顶级窗口

把MonthCalendar直接加到当前控件所在的顶级Form中,计算其在Form内的绝对位置,就能摆脱Panel的裁剪限制:

private void btn_Click(object sender, EventArgs e)
{
    if (mc.Parent == null)
    {
        // 获取当前控件所在的顶级Form
        var topForm = this.FindForm();
        topForm.Controls.Add(mc);
        // 计算控件在Form中的绝对位置(从当前控件下方开始)
        Point screenPosition = this.PointToScreen(new Point(0, this.Height));
        Point formPosition = topForm.PointToClient(screenPosition);
        mc.Location = formPosition;
        mc.BringToFront();
    }
    else
    {
        mc.Show();
    }
}

方案二:使用ToolStripDropDown承载(推荐)

这种方式完全复刻DateTimePicker的下拉逻辑,自带点击外部自动关闭、置顶显示的特性,体验更一致:

private ToolStripDropDown _calendarDropDown;

private void btn_Click(object sender, EventArgs e)
{
    if (_calendarDropDown == null || !_calendarDropDown.Visible)
    {
        // 初始化MonthCalendar
        var mc = new MonthCalendar();
        mc.MaxSelectionCount = 1;
        mc.DateSelected += (s, args) =>
        {
            // 选择日期后同步到TextBox
            this.textBox1.Text = mc.SelectionStart.ToString("yyyy-MM-dd");
            _calendarDropDown.Close();
        };

        // 创建下拉容器
        _calendarDropDown = new ToolStripDropDown();
        var controlHost = new ToolStripControlHost(mc);
        // 移除多余边距,让日历显示更紧凑
        controlHost.Margin = Padding.Empty;
        controlHost.Padding = Padding.Empty;
        _calendarDropDown.Padding = Padding.Empty;
        _calendarDropDown.Items.Add(controlHost);

        // 在当前控件下方显示下拉框
        _calendarDropDown.Show(this, 0, this.Height);
    }
    else
    {
        _calendarDropDown.Close();
    }
}

注意事项

  • 方案一中记得在关闭日历或窗体时,将MonthCalendar从Form的Controls中移除,避免内存泄漏。
  • 方案二中无需手动管理MonthCalendar的生命周期,ToolStripDropDown关闭时会自动处理。

内容的提问来源于stack exchange,提问作者Unis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:01:26