DataGridView と DataTable と Combobox(コンボボックス)

  • 2010.01.23 Saturday
  • 01:13
データベースやテキスト(CSV)ファイルをDataGridViewに表示させるのは簡単である。

たとえば、いま作っているのはテキストファイルをDataGridViewに表示させるソフトなのだが、

普通にカラムを作って、

ファイルを読み取り、
 
DataGridView.Rows.Add(読み取った配列)

で表示できる。

データの追加

しかし、Rows.Addされただけのデータソートが解除できない検索(簡単に)できないのは、
以前書いたとおりである。
(元に戻すには再読み込みなどをする必要がある。無理矢理やる方法もあるのでしょうが、私はそこまでは知りません)


なので、ソートや検索をしたい場合は、
まず、DataSetやDataTableなどにデータを起こして
それをDataSourceにバインドしてあげる方法が必要になる。
 
Dim ShopTable As New DataTable("おみせ")
‌ 
'読み取ったデータをDataTableへ書き込む
‌ 
Me.DataGridView1.DataSource = ShopTable ’DataGridViewのソースへつくったDataTableを入れてあげる。

しかし、こうすると・・・

データの追加

この例は、あらかじめDataGridViewのColumnsに、おみせ〜特売日のカラムが作ってあり、そこに、DataTableのデータを入れようとしたら・・・という感じの例である。

じゃあ、あらかじめ作らなければ・・・

データの追加

これならいける!とおもいますが、できれば、コンボボックスを表示させて、
選択を楽にしたいものである・・・。

しかし、DataTableはあくまでデータの入っている入れ物なので、
コンボボックスの機能があるわけではない・・・。

じゃあ、
 
Me.DataGridView1.AutoGenerateColumns = False

というおまじないがあるので、もしかしたら、勝手に入るかも・・・?
と試してみる

データの追加

データすら入ってこない・・・。

こうなると、なんとしてでも、
DataGridViewであらかじめ作ったColumnsへ
DataTableで作ったデータを入れて(DataGridViewのDataSourceにいれて)、
最終的にはComboboxで表示させたいっ!!

訳である。

まだ何かおまじないが足りないのかもしれない。

そうなんです。肝心なおまじない足りなかったのです。
DataPropertyNameが!

DataGridViewにあらかじめ設定したColumnsとDataTableのColumnを
リンクさせてあげるには、このおまじないが必要なのです。

ざっくり書くと、
 
Me.DataGridView1.Columns(0).DataPropertyName = ShopTable.Columns(0).ColumnName
Me.DataGridView1.Columns(1).DataPropertyName = ShopTable.Columns(1).ColumnName
Me.DataGridView1.Columns(2).DataPropertyName = ShopTable.Columns(2).ColumnName

でそれぞれ表示させたいカラム同士をリンクさせて

で、
データリンク

見事表示できました。

半日考えてわからなかった・・・無知すぎで恥ずかしいやら。


追記110901

コンボボックスにないデータが入ってしまった場合
例外エラーが発生します。

DataGridView コンボボックス エラー

DataGridViewで次の例外が発生しました
System.ArgumentException: DataGridViewComboBoxCellの値が有効ではありません。


たとえば、データベースからDataSourceにデータを入れるような場合は、
上の関連投稿などを参考にされるか、
エラーメッセージに書かれている通りDataErrorイベントで処理させるなどしてみてください。


追記
Comboboxに何が入るのかについて別投稿してみました。

また、データにないというよりも、格納したデータが正しく取り出せないということもあるようなので、
下記のような方法でエラーを取り除くと良いかもしれません。
DataGridViewComboBoxColumnって長いよ


構造体の場合は、
 
AddColumn.ValueMember = "Index"
AddColumn.DisplayMember = "Label" 

と表示したいプロパティを関連づけしてあげるとエラーが回避できます。
DataGridView と データベース と Combobox(コンボボックス)


参考URL
VB2005 DataGridViewに手動でコンボボックス列やチェックボックス列を作成
C# ComboBox列が含まれるDataGridViewをコードから作成する方法


関連投稿
データベースとDataGridViewをリンクする
DataGridView と データベース と Combobox(コンボボックス)
コンボボックスの値(データベースのレコード全体)を取得する方法

DataGridView
DataGridViewのボタンにアイコンを付ける

 
コメント
現在コンバータのGUI周りを作るのにC#を使い始めてこのページに行き着き、参考にさせていただきました。

私は現状DataTableを
--------------------------------------------
DataTable dt;
DataColumn dc;
dt = new DataTable();
dc = new DataColumn("FileName", typeof(string));
...
dt.Columns.Add(dc);
...
--------------------------------------------
↑の用に作成しているのですが
ComboBoxの情報のあるDataTableとはどのように作成しているのでしょうか?
よろしければ教えていただけないでしょうか?
よろしく願いします
  • Len
  • 2011/08/31 4:57 PM
参考にしていただきありがとうございます。


さて、質問の内容と違う答えかもしれませんが、

データの入っているDataTable(上の例ではDataTable("おみせ"))自体は、
たとえば、CSV区切りのデータと同じで、値しか入っていません。

上の例ですと、お店DataTableには

やおや,火曜日,TRUE
さかなや,月曜日,FALSE
にくや,水曜日,TRUE

という感じでデータが入っています。

また、DataGridViewの2カラム目には、

DataGridViewComboBoxColumnのItemsに月曜日〜日曜日がコレクションされており、
その値とお店DataTableの値が一致することで、コンボボックスが選択されることになります。

ですので、お店DataTableの曜日カラムにコンボボックスに存在しないデータが入ってしまうと
上に追記したようなエラーが出てしまいます。

もし、データの値と異なるリストを表示させたいようでしたら、
Itemsコレクションに配列などを登録し、
表示させたい値(DisplayMember 月曜日、火曜日など)と実際の値(ValueMember 0,1,2などの曜日番号)をそれぞれ指定して上げれば、
それが可能になります。

下記が参考になると思います。
http://dobon.net/vb/dotnet/datagridview/datagridviewcomboboxcolumn.html

データベースの場合は、
http://blog.syo-ko.com/?eid=894
をどうぞ

  • rockecco
  • 2011/09/01 1:30 PM
すごい分かりやすい!!
ここの所が分からなくて、時間も迫ってて泣きそうだったんです、なんだかお礼を言わずにいられなくてコメントさせて頂きました(´;ω;`)
ありがとうございます!
  • はしし
  • 2013/01/24 4:51 PM
こちらこそ、お役に立てて良かったです。
お仕事(?)がんばってください。
  • rockecco
  • 2013/01/24 6:00 PM
コメントする








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

calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
<< November 2019 >>

search this site.

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

categories

■Google AD■

アマゾン

楽天

selected entries

archives

recent comment

  • 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)
  • Shurikenで添付ファイルまとめて保存したい
    rockecco (04/23)
  • MacでBlu-ray編 〜 BD-Rを焼く その3 サポセン編
    たかなママ (04/22)

recent trackback

profile


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

others

mobile

qrcode

powered

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