【问题标题】:.NET Override Form Text Property.NET 覆盖表单文本属性
【发布时间】:2019-02-25 00:45:11
【问题描述】:

我有一个名为MyForm 的表单,它继承自Windows.Forms.Form。在这个表格上,我有一个名为_msgBoxTextBox。现在,当我在MyForm 上设置Text 属性时,我实际上想设置_msgBoxText 属性。我写了一个简单的属性来做到这一点:

Public Overloads Property Text As String
    Get
        Return _msgBox.Text
    End Get
    Set(value As String)
        _msgBox.Text = value
    End Set
End Property

但是,这不起作用。所以,我用我的 Google-fu 并且能够找到this forum post,此时我将我的代码更改为:

<Browsable(True)>
<EditorBrowsable(EditorBrowsableState.Always)>
<Bindable(True)>
<DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)>
Public Overloads Property Text As String
    Get
        Return _msgBox.Text
    End Get
    Set(value As String)
        _msgBox.Text = value
    End Set
End Property

这仍然没有解决问题,所以我在SO上查看并找到this question,这表明我也需要设置基本属性。我这样做了,我的代码现在看起来像这样:

<Browsable(True)>
<EditorBrowsable(EditorBrowsableState.Always)>
<Bindable(True)> 
<DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)>
Public Overloads Property Text As String
    Get
        Return _msgBox.Text
    End Get
    Set(value As String)
        MyBase.Text = value
        _msgBox.Text = value
    End Set
End Property

但我仍然没有看到这个属性被设置。当我调用MyForm.Text 时,基本Text 属性已设置,但我的内部属性仍未设置。我该如何解决这个问题?

【问题讨论】:

  • 如果要覆盖,为什么要使用Overloads 关键字而不是Overrides 关键字?
  • @jmcilhinney 自动完成?
  • @VisualVincent 我也投票关闭它。我没有注意到,因为我不习惯 VB.NET 有一个 overloads 关键字
  • 实际上,问题远不止于此,因为即使您覆盖而不是重载,代码仍然会抛出NullReferenceException,正如我在回答中提到的那样。
  • @jmcilhinney 这是真的,如果这已经足够了,那么你可以离开它。我会自己解决这个问题,除非这段代码实际上没有被命中;)

标签: .net vb.net winforms inheritance


【解决方案1】:

我刚刚做了一些测试,这很有效:

Public Overrides Property Text As String
    Get
        Return If(TextBox1 Is Nothing, MyBase.Text, TextBox1.Text)
    End Get
    Set
        MyBase.Text = Value
        TextBox1.Text = Value
    End Set
End Property

请注意,在getter 中,它会测试TextBox 是否存在并仅在存在时才使用它,否则它使用表单。我从这个开始:

Return TextBox1.Text

我得到了一个 NullReferenceException 抛出,大概是因为在创建 TextBox 之前使用了 Text 属性值。

【讨论】:

    【解决方案2】:

    这比您尝试的要简单得多。只需通过表单的 TextChanged 事件更改 TextBox 的文本:

    Public Class Form1
    
        Private Sub Form1_TextChanged(sender As Object, e As EventArgs) Handles Me.TextChanged
            TextBox1.Text = Me.Text
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.Text = "My New Text"
        End Sub
    
    End Class
    

    在窗体上试试这个,当窗体加载时,TextBox 将具有与窗体相同的文本。

    【讨论】:

      猜你喜欢
      • 2011-06-21
      • 2014-04-17
      • 2013-08-03
      • 1970-01-01
      • 2013-08-16
      • 2017-05-05
      • 2011-09-10
      • 1970-01-01
      相关资源
      最近更新 更多