编写像DateTimePicker这样的自定义控件

时间:2012-11-23 08:16:55

标签: c# winforms user-controls datetimepicker

我一直在尝试实现一个自定义控件,就像标准的Winform DateTimePicker控件一样..只是我需要我的控件来显示以英尺和英寸为单位的架构长度值...就像9'-6“。控件应该以这种方式工作..

  • 控件右侧应显示单个上下旋转按钮..
  • 控件应该有2个子字段,一个用于英尺,一个用于英寸..字段应为具有自己边框的个人TextBox ..
  • 如果没有与控件关联的值,则应显示灰色的“重新设置长度”的幻影文本字符串。
  • 当点击控件时,它应显示?' - ?“,如果用户点击而不输入任何长度,则应重新显示重影文本..
  • 单击时只能选择子字段..并且updown旋转按钮仅更改当前选定的子字段..
  • 英寸子字段应以3为单位递增和递减,并围绕其范围0到11 ..

我认为所有功能都存在于标准DateTimePicker控件中的某个地方(或者可以被覆盖),但鬼文本要求除外..所以我应该问的是究竟是怎么回事? DateTimePicker实际上有效吗?我怎样才能复制它的外观和行为..

我已经浏览过Google和stackoverflow很多但没有遇到类似的问题或答案..


编辑01:

我认为updownbase和maskedtextbox的组合可能是我需要使用的...但是我不知道如何......对于一个.. maskedtextbox在点击时不选择子字段..还有如何获取updownbase到使用maskedtextbox中当前选定的子字段..

1 个答案:

答案 0 :(得分:4)

我会尝试发布一些有助于您入门的信息,即使它没有直接解决您的所有问题。首先,您可以获得免费的dotpeek反编译器,执行CTRL + T,查找DateTimePicker类型并了解其工作原理。准备好看很多winapi电话。除非你确信你能够理解所有的东西并重新编写它以满足你的需要,否则不要走这条路。

更简单的方法是创建自定义控件。它可能看起来不太好,但至少你可以让它更快地工作。例如,创建一个UserControl1,其中包含一个TextBox +一个Button:

Public Class UserControl1
  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim frm As New Form2
    Dim p = frm.PointToScreen(New Point(Me.Left, Me.Bottom))
    frm.Location = New Point(Me.ParentForm.Left, Me.ParentForm.Top + 40) + p
    frm.Show()
  End Sub
End Class

免责声明:执行+40是一个糟糕的编码标准,但这是我在努力将坐标转换为屏幕/客户端后所能想到的最佳标准。如果您找到更好的方法 - 请在评论中提出建议。

无论如何,在设计时它看起来像这样:

enter image description here

Form2是你的弹出窗口,如果焦点丢失会关闭,模仿真正的弹出行为:

Public Class Form2
  Private Sub Form2_Deactivate(sender As Object, e As System.EventArgs) Handles Me.Deactivate
    Me.Close()
  End Sub
End Class

在设计时它看起来像这样(FormBorderStyle =无):

enter image description here

将此控件编译并放到主窗体上。运行您的应用程序 - 当您单击按钮时,ft / in下拉列表将显示在您的控件下方。正如任何弹出窗口所做的那样(包括DateTimePicker的弹出窗口),如果你点击其他地方它会消失(Deactivate事件被用来让它像这样工作)。这是一张图片,用于说明其行为:

enter image description here

现在添加验证,格式化等。