Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向系统定义的类VB.NET添加属性_Vb.net - Fatal编程技术网

如何向系统定义的类VB.NET添加属性

如何向系统定义的类VB.NET添加属性,vb.net,Vb.net,假设我想向类添加一个属性,比如DataGridViewColumn 有没有这样一种方法可以使我将这些对象强制转换为DataGridViewCheckBoxColumn这是我目前正在做的事情,但给了我一个错误 我有自己的类DataGridViewColumn Public Class DataGridViewColumn Inherits System.Windows.Forms.DataGridViewColumn Private Field As String Public Property

假设我想向类添加一个属性,比如
DataGridViewColumn

有没有这样一种方法可以使我将这些对象强制转换为DataGridViewCheckBoxColumn这是我目前正在做的事情,但给了我一个错误

我有自己的类
DataGridViewColumn

Public Class DataGridViewColumn
Inherits System.Windows.Forms.DataGridViewColumn

Private Field As String
Public Property SomeField() As String
    Get
        Return Field
    End Get
    Set(ByVal value As String)
        Field = value
    End Set
End Property
End Class
这很好,并且按照我想要的方式工作。但是当我去尝试这样的事情时。。。它不喜欢它

Private Function gen(name As String) As DataGridViewColumn
        Select Case name
            Case "DataGridViewTextBoxColumn"
                Dim c2 As New DataGridViewTextBoxColumn
                c2.Name = "tstColumn"
                c2.HeaderText = "Test Column"
                c2.ReadOnly = False
                Return c2
        End Select
        Return Nothing
    End Function
有没有办法让我这么做?我还尝试创建了一个
DataGridViewTextBoxColumn
类,并插入了
System.Windows.Forms.DataGridViewTextBoxColumn
,但似乎没有任何效果


错误只是说不能转换为DataGridViewColumn类型,即使我有自己的DataGridViewTextBoxColumn

我想无论如何我都会提供我在评论中建议的答案。如果您只想要一个“属性”,则可以执行以下操作:

Imports System.Runtime.CompilerServices

Namespace YourBusinessName.Windows.Forms

    Public Module DataGridViewColumnExtensions

        <Extension>
        Public Function GetField(source As DataGridViewColumn) As String
            Return TryCast(source.Tag, String)
        End Function

        <Extension>
        Public Sub SetField(source As DataGridViewColumn, value As String)
            source.Tag = value
        End Sub

    End Module

End Namespace
如果您想要多个“属性”,那么您可以使用
字典来增强它:

Imports System.Runtime.CompilerServices

Namespace YourBusinessName.Windows.Forms

    Public Module DataGridViewColumnExtensions

        <Extension>
        Public Function GetField1(source As DataGridViewColumn) As String
            Return GetField(source, "Field1")
        End Function

        <Extension>
        Public Function GetField2(source As DataGridViewColumn) As String
            Return GetField(source, "Field2")
        End Function

        Private Function GetField(source As DataGridViewColumn, propertyName As String) As String
            Dim fields = TryCast(source.Tag, Dictionary(Of String, Object))

            If fields Is Nothing OrElse Not fields.ContainsKey(propertyName) Then
                Return Nothing
            End If

            Return TryCast(fields(propertyName), String)
        End Function

        <Extension>
        Public Sub SetField1(source As DataGridViewColumn, value As String)
            SetField(source, "Field1", value)
        End Sub

        <Extension>
        Public Sub SetField2(source As DataGridViewColumn, value As String)
            SetField(source, "Field2", value)
        End Sub

        Private Sub SetField(source As DataGridViewColumn, propertyName As String, value As String)
            Dim fields = TryCast(source.Tag, Dictionary(Of String, Object))

            If fields Is Nothing Then
                fields = New Dictionary(Of String, Object)
                source.Tag = fields
            End If

            fields(propertyName) = value
        End Sub

    End Module

End Namespace

请注意,扩展
DataGridViewColumn
类的方法可以在任何类型的对象上调用,该对象是
DataGridViewColumn

,我想不管怎样,我都会提供我在评论中建议的答案。如果您只想要一个“属性”,则可以执行以下操作:

Imports System.Runtime.CompilerServices

Namespace YourBusinessName.Windows.Forms

    Public Module DataGridViewColumnExtensions

        <Extension>
        Public Function GetField(source As DataGridViewColumn) As String
            Return TryCast(source.Tag, String)
        End Function

        <Extension>
        Public Sub SetField(source As DataGridViewColumn, value As String)
            source.Tag = value
        End Sub

    End Module

End Namespace
如果您想要多个“属性”,那么您可以使用
字典来增强它:

Imports System.Runtime.CompilerServices

Namespace YourBusinessName.Windows.Forms

    Public Module DataGridViewColumnExtensions

        <Extension>
        Public Function GetField1(source As DataGridViewColumn) As String
            Return GetField(source, "Field1")
        End Function

        <Extension>
        Public Function GetField2(source As DataGridViewColumn) As String
            Return GetField(source, "Field2")
        End Function

        Private Function GetField(source As DataGridViewColumn, propertyName As String) As String
            Dim fields = TryCast(source.Tag, Dictionary(Of String, Object))

            If fields Is Nothing OrElse Not fields.ContainsKey(propertyName) Then
                Return Nothing
            End If

            Return TryCast(fields(propertyName), String)
        End Function

        <Extension>
        Public Sub SetField1(source As DataGridViewColumn, value As String)
            SetField(source, "Field1", value)
        End Sub

        <Extension>
        Public Sub SetField2(source As DataGridViewColumn, value As String)
            SetField(source, "Field2", value)
        End Sub

        Private Sub SetField(source As DataGridViewColumn, propertyName As String, value As String)
            Dim fields = TryCast(source.Tag, Dictionary(Of String, Object))

            If fields Is Nothing Then
                fields = New Dictionary(Of String, Object)
                source.Tag = fields
            End If

            fields(propertyName) = value
        End Sub

    End Module

End Namespace

请注意,扩展
DataGridViewColumn
类的方法可以在任何类型的对象上调用,该对象是
DataGridViewColumn

的继承对象。首先,我将使用与NET已经使用的类名不同的类名。可能是
DataGridViewColumnEx
。但是,由于TextBoxColumn与基本DataGridViewColumn的类型不同,因此您将遇到其他问题。通用的会解决的好的,谢谢你。但是,还有更简单的方法来实现这一点吗?这样我就不需要费尽心机只向datacolumn添加一个简单的属性了?您似乎在说您希望从
DataGridViewColumn
派生您自己的类,然后让其他继承
DataGridViewColumn
的类以某种方式接管你们班。答案是否定的,这并没有发生。继承
DataGridViewColumn
的类只知道
DataGridViewColumn
的成员。黑客的一个选择可能是编写两个扩展方法,以获取和设置列的
标记
属性中所需的数据。如果您对此感兴趣,我可以在回答中提供代码。请注意,在许多情况下,数据不会直接推送到DGV中。使用数据源,如数据表。它已经有了一个类型化的字段getter,它的形式是扩展名:
dr.Field(of T)(index | Name)
。我首先要使用一个不同于NET已经使用的类名的类名。可能是
DataGridViewColumnEx
。但是,由于TextBoxColumn与基本DataGridViewColumn的类型不同,因此您将遇到其他问题。通用的会解决的好的,谢谢你。但是,还有更简单的方法来实现这一点吗?这样我就不需要费尽心机只向datacolumn添加一个简单的属性了?您似乎在说您希望从
DataGridViewColumn
派生您自己的类,然后让其他继承
DataGridViewColumn
的类以某种方式接管你们班。答案是否定的,这并没有发生。继承
DataGridViewColumn
的类只知道
DataGridViewColumn
的成员。黑客的一个选择可能是编写两个扩展方法,以获取和设置列的
标记
属性中所需的数据。如果您对此感兴趣,我可以在回答中提供代码。请注意,在许多情况下,数据不会直接推送到DGV中。使用数据源,如数据表。它已经有了一个类型化字段getter,其形式是扩展名:
dr.Field(of T)(index | Name)
。非常感谢。这肯定有帮助。非常感谢。这肯定有帮助。