QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

DataGridView内のComboBox

0 PV

こんにちは。
いつも参照させていただいて、お世話になっています。
現在、以下の環境で開発を行っています。
 OS:Windows XP
 ソフト:Visual Studio 2005+.NET Framework 2.0
 言語:VB

とても簡単なことだと思うのですが、ネット上をかなりしつこく検索しても答えが見つかりません…
Windowsフォーム上のDataGridView内でComboBoxを使用しているのですが、その値を任意のタイミング
で任意のものに変更したいのです。
通常のComboBoxでしたらSelectedIndexなどを使用して変更できますよね。
だけれども、DataGridView内でComboBox(DataGridViewComboBoxCell)には、それらしいプロパティ
も見当たらないですし、かといって
 DataGridView1.Rows(0).Cells("combo").Value = 2
とかやってもエラーになってしまいます。
どなたかご存じないでしょうか?
よろしくお願いいたします。

質問者:JYUNA

回答

とりあえずgoogle先生で見つけたMSDNの過去ログ

リファレンス見れば判ると思うけど、
DataGridViewComboBoxCell クラスはDataGridViewComboBoxEditingControl クラスをホストするだけの物なので、資料を探すならDataGridViewComboBoxEditingControlクラスの方かな。
DataGridViewComboBoxEditingControlのリファレンスにもSelectedIndexChangedのイベント追加サンプルあるんで見て下さいな。

うん、クラス名長すぎ。

投稿者:未記入

編集 履歴 (0)

EditingControl関連は編集するグリッドの際に利用できるので、ケースによっては
アウトな場合がありますね(表示のみに利用している際とか)。

それとアンバウンドな場合とバウンドしている場合とで解決方法は異なると思います。

アンバウンドな場合はDataGridViewComboBoxColumnクラスで保持している
項目(Itemsコレクション)を参照してセルの値を更新する必要があったような・・・。

コンボボックスセルの項目に独自クラスを利用する際とかに、この手段を利用しましたけど。

投稿者:Ahf

編集 履歴 (0)

こんにちは。
未記入さん、Ahfさん、ありがとうございました。

まだまだ勉強不足で、完全にすべて理解しているわけではないのですが……

未記入さんが教えてくれた「MSDNの過去ログ」のリンク先をさっそく見てみましたが、普通に
Valueプロパティに値を設定していますね。でも前に書いたとおり、それだとエラーが発生して
しまいます。その際には下記メッセージが表示されます。
 「System.FormatException: DataGridViewComboBoxCell の値が有効ではありません」
エラーが発生し、さらに設定した値がComboBoxに表示されます。まるでItemが編集されてしまって
いるような感じです。
DataGridViewCheckBoxCellならValueプロパティで簡単に変更できるのに……なぜ??

DataGridViewComboBoxEditingControlについては、セルが編集モードの時に使用できるみたいですね。
たしかにEditingControlShowingイベントでは、e.ControlをDataGridViewComboBoxEditingControl
に、もしくはComboBoxにも変換できますので、SelectedIndexが使用できます。
ただ編集モードじゃないときにComboBoxの選択されている値を変更したいのです。

DataGridViewComboBoxColumn(というか個別のセルの話なのでDataGridViewComboBoxCell)のItems
にも着目してみましたが、使えそうなプロパティとかないようです……

というわけで、今回はあきらめて、ComboBoxを使用しない方法を考えようと思います。
貴重なお時間を割いていただいて、ありがとうございました。

投稿者:JYUNA

編集 履歴 (0)

判りにくい例だったのは申し訳ないです。

MSDN過去ログにあったValueに設定している値はIndex値ではありません。
コンボボックスのItemsのValue値の一つです。
(コンボボックスに1,2,3と設定されていると考えてください。)

なので初期値を設定した時はIndex値では無く、ComboboxのIndex値の位置にあるValue値を設定して下さい。
(エラーはセルに設定した値がコンボボックスのItemsに無いというエラーのハズです。)

コンボボックスのItemsに「a」、「b」、「c」とあるとして、
dataGridViewの0,0位置にあるセルに初期値「b」を設定するには、
 dataGridView1[0, 0].Value = "b";
とすればOKです。

投稿者:未記入

編集 履歴 (0)

こんにちは。
未記入さん、たびたびすみません、ありがとうございます。

大丈夫です。勘違いしてないです。Value値を設定していたのですが、だめだったんです。

だけれど……結論からいくと、できました!

実は元々ComboBoxにはDataSourceを使用して表示する項目をセットしていたんです(すみません、
こういうことは最初に言っておくべきでした)。その場合、ValueMemberの値を設定しても、
DisplayMemberの値を設定しても、両方ともエラーになっちゃいます。Valueプロパティの内容を
参照すると、ちゃんとValueMemberの値が参照できるんですが。

そこで、DataSourceを使用せずにItems.Addで項目を追加してやったところ、たしかにValueプロパティ
に値を設定してやれば、ちゃんと動くようになりました。

本当は、表示内容と値(Valueプロパティの値)を使い分けたかったんですが、そこの部分について
は工夫次第で何とかなります。若干、釈然としない気持ちは残りますが……

助かりました。ありがとうございました。

投稿者:JYUNA

編集 履歴 (0)

JYUNAさんの書き込み(2007-04-27 19:54)より:

本当は、表示内容と値(Valueプロパティの値)を使い分けたかったんですが、そこの部分について

これを行うためにはDataGridViewComboBoxCellとDataGridViewComboBoxColumn、
そしてDataGridViewComboBoxEditingControlクラスをそれぞれ継承して拡張する
必要があります。

それとDataGridViewComboBoxCellではコンボボックスの項目についての情報は
全く保持していません。関連するプロパティが存在しないのはその為です。
他の〜Cellクラスもそうですが、このクラスはあくまでもセルの表示に関わる
処理を行う為に用意されています。

#例外はIDataGridViewCellEditorを継承しているセル(CheckBoxCellなど)

投稿者:Ahf

編集 履歴 (0)

Ahfさん、こんにちは。

そうですね、継承して拡張する等、工夫したいと思います。
ありがとうござました。
[ メッセージ編集済み 編集者: JYUNA 編集日時 2007-04-28 19:51 ]

投稿者:JYUNA

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。