2016-07-21 4 views
0

私はDataGridViewColumnのようなクラスにプロパティを追加したいと言うことができます。システム定義クラスにプロパティを追加する方法VB.NET

このような方法で、これらのオブジェクトをキャストできます。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を継承しようとしましたが、何も動作していないようです。

エラーは単に私は自分のDataGridViewTextBoxColumn

+0

私はNETですでに使用されているものとは異なるクラス名を使用することから始めます。たぶん 'DataGridViewColumnEx'。 TextBoxColumnは基本的なDataGridViewColumnとは異なるタイプなので、他の問題があります。ジェネリックはそれを修正するだろう – Plutonix

+0

それは大丈夫です。しかし、これを行う簡単な方法がまだあるので、データ列に単純なプロパティを追加するだけですべての問題を解決する必要はありませんか? – 3kings

+1

'DataGridViewColumn'から独自のクラスを派生させ、' DataGridViewColumn'を継承してクラスのメンバーを引き継ぐ他のクラスを作成したいと言っているようです。答えはいいえ、それは起こっていません。 'DataGridViewColumn'を継承するクラスは、' DataGridViewColumn'のメンバーについてのみ知っています。ハックの1つのオプションは、列の 'Tag'プロパティに目的のデータを取得して設定するための2つの拡張メソッドを書くことです。あなたがそれに興味を持っているなら、私は答えにコードを提供することができます。 – jmcilhinney

答えて

2

を持っている場合でも、私は、私は関係なく、私のコメントで提案されている答えを提供したいことを考え出しDataGridViewColumn型に変換できないと言います。

Imports YourBusinessName.Windows.Forms 

'... 

Me.Column1.SetField("Hello World") 

Dim fieldValue = Me.Column1.GetField() 

あなたは複数の「プロパティ」を望んでいたなら、あなたはそれを牛肉ことができます:あなたは、このように、これらのメソッドを使用することができます

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 

:あなたは、単一の「プロパティ」を望むなら、あなたはこれを行うことができますDictionaryでアップ:

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から継承または継承する任意の型のオブジェクトで呼び出すことができます。

+0

ありがとうございました。これは間違いなく助けになります。 – 3kings

関連する問題