Vb.net 复合控件文本框在窗体上放置时默认控件名称

Vb.net 复合控件文本框在窗体上放置时默认控件名称,vb.net,custom-controls,Vb.net,Custom Controls,我有一个用户控件,它由一个面板和一个文本框组成。我已经重写了UserControl的Text属性,因此可以公开TextBox的Text属性 <BindableAttribute(False)> <EditorBrowsable(EditorBrowsableState.Always), Browsable(True), _ DesignerSerializationVisibility(DesignerSerializationVisibility.Visible

我有一个用户控件,它由一个面板和一个文本框组成。我已经重写了UserControl的Text属性,因此可以公开TextBox的Text属性

  <BindableAttribute(False)>
  <EditorBrowsable(EditorBrowsableState.Always), Browsable(True), _
   DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), DefaultValue("")>
  Public Overrides Property Text() As String
    Get
      Return txtText.Text
    End Get
    Set(value As String)
      txtText.Text = value
    End Set
  End Property

Public将属性Text()重写为字符串
得到
返回txtText.Text
结束
设置(值为字符串)
Text.Text=值
端集
端属性
这是可行的,我可以使用属性在TextBox中设置文本值。我遇到的问题是,当我将控件添加到表单时,控件的名称会出现在文本框中。每次将此控件添加到表单时,我都需要手动转到Text属性并删除该值。我正在寻找一种方法来克服这种行为。将控件添加到表单时,我希望文本值为String.Empty

有什么想法吗?我花了几个小时到处看看,什么也没找到。我发现的很多线程都与ASP.NET有关。这是我正在使用的标准windows窗体


谢谢

名称
文本
是两个不同的属性

Name
将产生类似于
controlname1
的结果。可能您无意中在UserControl中将TextBox的
Text
属性设置为
“TextBox”
。删除它


更新

WinForms设计器似乎正在自行添加此文本。 您可以这样解决问题:

Imports System.ComponentModel
Imports System.Text.RegularExpressions

Public Class UserControl1
    Private _designMode As Boolean

    Public Sub New()
        InitializeComponent()
        _designMode = LicenseManager.UsageMode = LicenseUsageMode.Designtime
    End Sub

    <BindableAttribute(False)> _
    <EditorBrowsable(EditorBrowsableState.Always), Browsable(True), _
      DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), _
      DefaultValue("")> _
    Public Overrides Property Text() As String
        Get
            Return txtText.Text
        End Get
        Set(ByVal value As String)
            If Not _designMode OrElse _
               Not Regex.IsMatch(value, Me.GetType().Name & "\d+") Then
                txtText.Text = value
            End If
        End Set
    End Property
End Class
导入System.ComponentModel
导入System.Text.RegularExpressions
公共类UserControl1
Private\u设计模式为布尔型
公共分新()
初始化组件()
_designMode=LicenseManager.UsageMode=LicenseSusageMode.Designtime
端接头
_
_
Public将属性Text()重写为字符串
得到
返回txtText.Text
结束
设置(ByVal值作为字符串)
如果不是_designMode或lse_
而不是Regex.IsMatch(value,Me.GetType().Name&“\d+”),那么
Text.Text=值
如果结束
端集
端属性
末级

如果处于设计模式,并且该值对应于控件名称加上一个数字,则不会设置文本。这样可以确保在设计时仍然可以设置文本。如果在设计时不需要设置文本,可以删除条件的Regex部分。

我知道它们是不同的属性。这个控件非常基本。.Text属性在我上面包含的代码中的唯一位置。如果我在集合中注释掉txtEdit.Text=值,则控件的名称不在文本框中。我认为这与向表单添加新用户控件时发生的情况有关。有时,Text属性被设置为控件的名称。例如,如果我删除一个GroupBox,它的标题将是GroupBox1。标题是文本属性。我认为重写属性可以解决这个问题。我想说的是:在设计器中打开UserControl,选择文本框,查看其
Text
属性是否为空(在属性网格中)。如果它是空的,您应该能够删除窗体上的UserControl,并且它们应该保持为空。Text属性为空。我觉得这是VB正在做的事情,尽管有重写的文本属性。如果我创建了一个名为TextValue的属性而不是Text,并使用它来获取和设置TextBox中的值,那么它就可以正常工作。这只是使用重写文本属性的问题。这是默认行为。在表单上弹出一个新标签,名称==文本;添加一个新的GroupBox,名称==文本。NET会在创建新的文本框时覆盖它,但会使用很久以前将其添加到UC canvas.Right时完成的UC。对于文本框,在它消失之前,您可以在新添加的文本框中看到名称闪烁。明天我将尝试一下下面的想法,看看它是如何工作的。你会认为有一种方法可以推翻这种行为。