如何向系统定义的类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)
。非常感谢。这肯定有帮助。非常感谢。这肯定有帮助。