Vb.net 在设计模式下添加自定义控件

Vb.net 在设计模式下添加自定义控件,vb.net,winforms,Vb.net,Winforms,我制作了一个自定义用户控件,由一个复选框、几个文本框和一些代码组成。我发现它在设计模式下显示在组件工具箱中,但当我将其拖到项目中时,它会给我一个错误,类似于“未能创建组件”、“未找到构造函数”和一系列围绕称为绑定的语句 我本来不打算在设计模式中使用它,但因为我现在知道它是一种可能性,我很感兴趣,如果它有可能使它与设计模式兼容 编辑: 控制部件在设计模式下设计,它们是 “cCheckbox”-一个开/关开关 “cInterval”-仅允许数字的文本框 “cUnit”-一个下拉组合框,包含从秒到天的

我制作了一个自定义用户控件,由一个复选框、几个文本框和一些代码组成。我发现它在设计模式下显示在组件工具箱中,但当我将其拖到项目中时,它会给我一个错误,类似于“未能创建组件”、“未找到构造函数”和一系列围绕称为绑定的语句

我本来不打算在设计模式中使用它,但因为我现在知道它是一种可能性,我很感兴趣,如果它有可能使它与设计模式兼容

编辑: 控制部件在设计模式下设计,它们是 “cCheckbox”-一个开/关开关 “cInterval”-仅允许数字的文本框 “cUnit”-一个下拉组合框,包含从秒到天的单位 控件的目的是提供一个用户可修改的计时器,用于为程序的另一部分生成滴答事件

Public Class ucTimer1
  Public Event Tick(time As Date)
  Private WithEvents t As New Timer With {.Interval = 1000}
  Private lastTick As DateTime = DateTime.UtcNow
  Private interval As TimeSpan
  Public persistent As Boolean = True
  Public sDat As New List(Of Object)

Public Sub New(Optional sDat() As Object = Nothing)
    InitializeComponent()
    turnOff()
    AddHandler cCheck.CheckedChanged, Sub() If cCheck.Checked Then turnOn() Else turnOff()
    cUnit.SelectedIndex = 1

    If Not sDat Is Nothing Then
        lastTick = sDat(0)
        cInterval.Text = sDat(1)
        cUnit.SelectedIndex = sDat(2)
        cCheck.Checked = sDat(3)
    End If
End Sub
Public Sub textFilter(sender As Object, e As KeyPressEventArgs) Handles cInterval.KeyPress
    If e.KeyChar <> Convert.ToChar(8) Then
        If Not "0123456789".Contains(e.KeyChar.ToString) Or cInterval.Text.Length > 2 Then
            e.Handled = True
        End If
    End If
End Sub
Public Sub turnOff()
    If cCheck.Checked = True Then cCheck.Checked = False
    cCheck.ForeColor = Color.DarkRed
    cInterval.Enabled = False
    cUnit.Enabled = False
    cIntervalBackground1.BackColor = BackColor
    cIntervalBackground2.BackColor = BackColor
    save()
End Sub
Public Sub turnOn()
    If cCheck.Checked = False Then cCheck.Checked = True
    cInterval.Enabled = True
    cUnit.Enabled = True
    cIntervalBackground1.BackColor = cInterval.BackColor
    cIntervalBackground2.BackColor = cInterval.BackColor
    evalInterval()
End Sub
Private Sub evalInterval() Handles cInterval.TextChanged, cUnit.SelectedIndexChanged
    Dim seconds As Integer
    If Not Integer.TryParse(cInterval.Text, seconds) Then seconds = 0

    Select Case cUnit.SelectedIndex
        Case 0
            seconds *= 1
        Case 1
            seconds *= 60
        Case 2
            seconds *= 3600
        Case 3
            seconds *= 86400
        Case Else
            seconds *= 0
    End Select

    If seconds < 1 Then
        cCheck.ForeColor = Color.DarkRed
        t.Enabled = False
    Else
        interval = New TimeSpan(0, 0, seconds)
        cCheck.ForeColor = Color.Green
        t.Enabled = True
    End If
    save()
End Sub
Private Sub ticker() Handles t.Tick
    If interval = Nothing Then Return
    If DateTime.Now - lastTick > interval Then
        lastTick = DateTime.Now
        RaiseEvent Tick(DateTime.Now)
    End If
End Sub
Private Sub save()
    If Not persistent Then Return
    sDat.Clear()
    sDat.Add(lastTick)
    sDat.Add(cInterval.Text)
    sDat.Add(cUnit.SelectedIndex)
    sDat.Add(cCheck.Checked)
End Sub
End Class
公共类1
公共事件勾号(时间为日期)
Private With events t作为{.Interval=1000}的新计时器
Private lastTick As DateTime=DateTime.UtcNow
作为时间跨度的专用间隔
公共持久化为布尔值=True
公共sDat作为新列表(对象)
Public Sub New(可选sDat()作为对象=无)
初始化组件()
关闭()
AddHandler cCheck.CheckedChanged,Sub()如果cCheck.Checked,则打开()否则关闭()
cUnit.SelectedIndex=1
如果不是sDat,那就什么都不是了
lastTick=sDat(0)
cInterval.Text=sDat(1)
cUnit.SelectedIndex=sDat(2)
cCheck.Checked=sDat(3)
如果结束
端接头
公共子文本筛选器(发件人作为对象,e作为KeyPressEventArgs)处理cInterval.KeyPress
如果e.KeyChar Convert.ToChar(8),则
如果不是“0123456789”.Contains(例如KeyChar.ToString)或cInterval.Text.Length>2,则
e、 已处理=真
如果结束
如果结束
端接头
公共分闸
如果cCheck.Checked=True,则cCheck.Checked=False
cCheck.ForeColor=Color.DarkRed
cInterval.Enabled=False
cUnit.Enabled=False
cIntervalBackground1.BackColor=背景色
cIntervalBackground2.BackColor=背景色
保存()
端接头
公共子开关()
如果cCheck.Checked=False,则cCheck.Checked=True
cInterval.Enabled=True
cUnit.Enabled=True
cInterval背景1.BackColor=cInterval.BackColor
cInterval背景2.BackColor=cInterval.BackColor
evalInterval()
端接头
Private Sub evalInterval()处理cInterval.TextChanged、cUnit.SelectedIndexChanged
将秒设置为整数
如果不是Integer.TryParse(cInterval.Text,秒),则秒数=0
选择大小写cUnit.SelectedIndex
案例0
秒*=1
案例1
秒*=60
案例2
秒*=3600
案例3
秒*=86400
其他情况
秒*=0
结束选择
如果秒数小于1,则
cCheck.ForeColor=Color.DarkRed
t、 已启用=错误
其他的
间隔=新的时间跨度(0,0,秒)
cCheck.ForeColor=Color.Green
t、 启用=真
如果结束
保存()
端接头
Private Sub ticker()处理t.Tick
如果interval=Nothing,则返回
如果DateTime.Now-lastTick>interval Then
lastTick=DateTime.Now
RaiseEvent勾选(DateTime.Now)
如果结束
端接头
私有子存储()
如果不持久,则返回
sDat.Clear()
sDat.Add(最后一个勾号)
sDat.Add(cInterval.Text)
sDat.Add(cUnit.SelectedIndex)
sDat.Add(cCheck.Checked)
端接头
末级

在构造器中,检查它是否为设计模式,只运行特定的代码—它不处于设计模式,类似于:

Public Sub New(Optional sDat() As Object = Nothing)
    InitializeComponent()

    If Not Me.DesignMode Then
        turnOff()
        AddHandler cCheck.CheckedChanged, Sub() If cCheck.Checked Then turnOn() Else turnOff()
        cUnit.SelectedIndex = 1

        If Not sDat Is Nothing Then
            lastTick = sDat(0)
            cInterval.Text = sDat(1)
            cUnit.SelectedIndex = sDat(2)
            cCheck.Checked = sDat(3)
        End If
    End If
End Sub

进行更改并重新生成解决方案(以强制其生效),然后在设计模式下重试。

尝试添加不带参数的新构造函数,并像这样更改原始构造

因为VB.Net在设计模式期间需要“Public Sub New()”构造函数

....Codes before this

Public Sub New()
    InitializeComponent()
    turnOff()
    AddHandler cCheck.CheckedChanged, Sub() If cCheck.Checked Then turnOn() Else turnOff()
    cUnit.SelectedIndex = 1
End Sub

Public Sub New(ByVal sDat() As Object)
    InitializeComponent()
    turnOff()
    AddHandler cCheck.CheckedChanged, Sub() If cCheck.Checked Then turnOn() Else turnOff()
    cUnit.SelectedIndex = 1
    If Not sDat Is Nothing Then
        lastTick = sDat(0)
        cInterval.Text = sDat(1)
        cUnit.SelectedIndex = sDat(2)
        cCheck.Checked = sDat(3)
    End If
End Sub

......Rest of your Code

你能发布你的代码吗?