Comboboxは何を入れるのか?DataGridView編〜VB2008

  • 2012.12.14 Friday
  • 01:58

結論から言うと、非常に面倒くさいので、あきらめました。


まずは前回のおさらい

DataGridViewにこんな感じでComboboxをねじ込むと・・・
 
Dim AddColumn As DataGridViewComboBoxColumn = New DataGridViewComboBoxColumn
‌ 
AddColumn.ValueType = GetType(Object)
‌ 
Call AddColumn.Items.Add(1I) '整数
Call AddColumn.Items.Add(1.0R) '倍精度
Call AddColumn.Items.Add("文字"'文字列
Call AddColumn.Items.Add(New TestStructure With {.Value = "テスト構造体1"})
Call AddColumn.Items.Add(New TestClass With {.Value = "テストクラス1"})
‌ 
Call Me.DataGridView1.Columns.Add(AddColumn)


一応リストされるが・・・

Comboboxに何を入れるのか

エラーが出る。

Comboboxに何を入れるのか

確かに、DataGridの場合、データベースをいじるので、
上の型では共通する部分が見つからず、エラーを起こしてしまう。


続く・・・


関連投稿
Comboboxは何を入れるのか?〜VB2008


 
じゃあ、唯一共通するToStringをValueMemberやDisplayMemberに登録したとしても・・・

Comboboxに何を入れるのか

次なるエラー

DataGridViewのComboboxでは型違いのデータはねじ込めないようである。



が、よくこのメッセージを読むとヒントになることが書かれている。
適当に直訳すれば、ねじ込んだデータから書式が正しく変換できなかったよ
という感じである。

ならば、ここをどうにかすればよいと言うことで、調べてみると、こんな記事が見つかった。

DataGridViewComboBoxColumnって長いよ


なるほど、ParseFormattedValueやGetFormattedValueあたりを改造すればよいのか・・・

と試行錯誤するが、いっこうにエラーは消えず。

上の参考記事では、1つの構造体についていじっているのだが、
今回は複数の異なる変数と言うことで、かなり面倒である。

ということで、現在はここで暗礁に乗り上げた状態である。


で、どうしてもDataGridViewで異なる型を使いたい場合は、こういった方法が1つの解決策である。

たとえば、TestStructureをこんな感じで赤い部分を追加する。
 
Public Structure TestStructure
‌ 
    Private _Value As String
    Private _Index As Int32
‌ 
    Public Property Value() As String
        Get
            Return _Value
        End Get
        Set(ByVal value As String)
            _Value = value
        End Set
    End Property
‌ 
    Public Property Index() As Int32
        Get
            Return _Index
        End Get
        Set(ByVal value As Int32)
            _Index = value
        End Set
    End Property
‌ 
    Public ReadOnly Property Label() As String
        Get
            Return _Value
        End Get
    End Property
‌ 
    'Public Overrides Function ToString() As String
    '    Return _Value
    'End Function
‌ 
End Structure


同じ要領で、TestClassを改造して、あとは好きな型の構造体なりクラスなりを作る。
例えば日付型を作ってみるとするなら、赤色部分を日付型にする。
 
Public Class TestDateClass
‌ 
    Private _Value As Date
    Private _Index As Int32
‌ 
    Public Property Value() As Date
        Get
            Return _Value
        End Get
        Set(ByVal value As Date)
            _Value = value
        End Set
    End Property
‌ 
    Public Property Index() As Int32
'・・・省略
‌ 
    Public ReadOnly Property Label() As String
        Get
            Return _Value.ToString("yyyy/MM/dd")
        End Get
    End Property
‌ 
End Class


Int型ならInt型、Double型ならDouble型と好きなように変更する。
それこそObject型にしておけばなんでもOKであるが、これだとごく当たり前な解決策なので、ここでは書かない・・・。

または、ステップアップでクラスで作って継承してOverloadかShadowでもよい

 
Public Class TestDateClass
    Inherits TestClass
‌ 
    Private Shadows _Value As Date 'TestClassがもともとPrivateならShasowsする必要は無いこの例はベースがProtectedだった場合
‌ 
    Private pIndex As Int32
‌ 
    Public Overloads Property Value() As Date
        Get
            Return _Value
        End Get
        Set(ByVal value As Date)
            _Value = value
        End Set
    End Property
‌ 
    Public Overrides ReadOnly Property Label() As String 'TestClassをあらかじめOverrisableにしておく、していなかったらOverLoadでもよい
        Get
            Return _Value.ToString("yyyy/MM/dd")
        End Get
    End Property
‌ 
End Class



で、これをComboboxへ格納して上げる
 
'異なる型のクラスや構造体が混在するItemを格納してみる
Call AddColumn.Items.Add(New TestStructure With {.Index = 1I, .Value = "テスト構造体"})
Call AddColumn.Items.Add(New TestClass With {.Index = 2I, .Value = "テストクラス"})
Call AddColumn.Items.Add(New TestDoubleClass With {.Index = 3I, .Value = 123.4})
Call AddColumn.Items.Add(New TestIntClass With {.Index = 4I, .Value = 123})
Call AddColumn.Items.Add(New TestDateClass With {.Index = 5I, .Value = Today})
‌ 
'おまじないは忘れないように
AddColumn.ValueMember = "Index"
AddColumn.DisplayMember = "Label" 


ここで、DisplayMemberを設定しない、または、"ToString"とやると再びエラーがでるので、
わざわざLabelプロパティを作ってDisplayに設定しているのは、こういった理由からである。

さて、早速表示していじってみる。

Comboboxに何を入れるのか

一応選択できる形となりました。


当たり前な話であるが、Indexはユニークにしておかないと、
同じ値があれば、先頭が選択されてしまうので注意したい。


わざわざ苦労してまでこんな強引なことをする人はいないかと思いますが、
とりあえず、なんでもできるかもしれない例ということで



関連投稿
Comboboxは何を入れるのか?〜VB2008

 
コメント
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    
<< December 2019 >>

search this site.

よく使う、検索される投稿

categories

■Google AD■

アマゾン

楽天

selected entries

archives

recent comment

  • Macで作った大きなファイルをWindowsへ分割して転送する
    rockecco (11/18)
  • Macで作った大きなファイルをWindowsへ分割して転送する
    汐里 (11/17)
  • H3 SRB-3燃焼試験
    rockecco (08/30)
  • H3 SRB-3燃焼試験
    綿棒 (08/29)
  • ブレークポイントは現在の設定ではヒットしません〜ソリューションのデバッグ
    B.T (08/09)
  • 山の白い看板
    rockecco (06/06)
  • 山の白い看板
    田舎人 (05/08)
  • あの、クラスとかメソッドとかプルダウンできるバーって〜Visual Studio 2015
    rockecco (04/27)
  • あの、クラスとかメソッドとかプルダウンできるバーって〜Visual Studio 2015
    NS (04/27)
  • MacでBlu-ray編 〜 BD-Rを焼く その3 サポセン編
    rockecco (04/23)

recent trackback

profile


※当ブログはリンクフリーですが、 取材や雑誌等で掲載される場合は、事前にお知らせください

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM