【问题标题】:DatetimePicker and other Controls in MenuStripMenuStrip 中的 DatetimePicker 和其他控件
【发布时间】:2017-04-18 10:16:50
【问题描述】:

我知道我可以使用以下几行将 DateTimePicker 添加到我的 MenuStrip

Dim dp = New ToolStripControlHost(New DateTimePicker)
MenuStrip1.Items.Add(dp)  

但我不知道如何在设计时将 DateTimePicker 添加到 MenuStrip。背后的诀窍是什么?我一直在尝试和寻找一个小时,即使我知道必须有办法,但我即将放弃!

TL;DR
如何在设计时将 DateTimePicker 添加到我的 MenuStrip? 或者,我们可以将其添加到 ToolStrip 中。

【问题讨论】:

  • 添加一个按钮并点击按钮打开日期时间选择器怎么样?
  • 这会给最终用户带来额外的表单、更多的点击和更少的概览。我没有选择。

标签: vb.net visual-studio custom-controls design-time menustrip


【解决方案1】:

您接近使用ToolStripControlHost 的解决方案,但您需要从该类派生,如链接到示例中所示。该示例令人沮丧的是,它没有使用System.Windows.Forms.Design.ToolStripItemDesignerAvailabilityAttribute 装饰派生类以使其在设计表面上可用。

以下是获得工作示例的极简实现。您可能需要覆盖自动调整大小以满足您对控件的需求/想要。该实现会覆盖Text 属性,以防止设计人员将无效文本分配给底层DateTimerPicker 控件。

<System.Windows.Forms.Design.ToolStripItemDesignerAvailability(
    System.Windows.Forms.Design.ToolStripItemDesignerAvailability.ToolStrip _
    Or System.Windows.Forms.Design.ToolStripItemDesignerAvailability.StatusStrip _
    Or System.Windows.Forms.Design.ToolStripItemDesignerAvailability.MenuStrip)> _
Public Class TSDatePicker : Inherits ToolStripControlHost
    Public Sub New()
        MyBase.New(New System.Windows.Forms.DateTimePicker())
    End Sub

    Public ReadOnly Property ExposedControl() As DateTimePicker
        Get
            Return CType(Control, DateTimePicker)
        End Get
    End Property

    <Browsable(False), EditorBrowsable(EditorBrowsableState.Advanced), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
    Public Overrides Property Text As String
        Get
            Return ExposedControl.Text
        End Get
        Set(value As String)
            ' verify valid date
            Dim dt As DateTime
            If DateTime.TryParse(value, dt) Then
                ExposedControl.Text = value
            End If
        End Set
    End Property
End Class

【讨论】:

  • This article 也可能有帮助
  • 我很确定这就是我所需要的,我几乎很抱歉问,但是我如何将它放入我的工具箱中,是否真的将它拖到我的表单上?
  • @Luke,这些类型的控件在工具条的可视化设计器“添加项目”下拉按钮中可用,也可以从属性网格中的 ToolStrip.Items 集合编辑器中选择。 AFAIK,它们不能放在工具箱中。
  • 真丢脸,我确定我昨天看了很多遍。可能我不得不重新启动 Visual Studio。但这对我来说非常有用。谢谢!所有属性都可以使用“ExposedControl”属性获得,它指的是原始的 DateTimePicker。只有事件必须在运行时使用 Addhandler TSDatePicker.ExposedControl.EVENTNAME 分配
  • 好的,我必须纠正自己。对公开的控件属性的更改需要以编程方式完成,因为一旦编译它们就会丢失。
【解决方案2】:

本来打算作为评论添加,但我相信它可以证明答案。

我成功的唯一方法是在设计时添加一个(到表单)并将Visible设置为False并使用菜单项将Visible设置为True(可能还需要设置位置和/或将其带到前面)。

您确实需要再次手动处理将Visible 设置为False

【讨论】:

  • 我认为您误解了这个问题。我不是在谈论 ContextMenuStrip(右键单击菜单),我希望它在任何时候都不可见。我说的是 MenuStrip,您可以在大多数没有功能区的应用程序之上找到它。
  • 所以您想让DateTimePicker 永久可见?
  • 可见性不是我的问题。我需要一个 MenuStripDateTimePicker 自定义控件。
  • @Luke 抱歉 - 应该先尝试上面的代码示例 - 您可以通过在设计时将 DateTimePicker 放在您想要的位置并选择“带上到前面”它将与您的菜单条显示一致,但除此之外,我不知道如何使其成为菜单条的一部分 - 尽管它应该很简单,但您是对的!
  • 已经尝试将 DateTimePicker 放在 MenuStrip 上并将其设置为 Anchor Top Right。只要我没有调整窗口大小就可以工作。因为当我这样做时,它覆盖了其他项目。日期时间选择器需要成为菜单条的一部分。感谢您的尝试 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
相关资源
最近更新 更多