C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: DataGridViewのComboBoxセルの変換について


(過去ログ 76 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■44728 / inTopicNo.1)  DataGridViewのComboBoxセルの変換について
  
□投稿者/ める (33回)-(2009/12/16(Wed) 18:11:51)

分類:[C#] 

いつもお世話になっております。
二つのテーブルがあります。

<<テーブルA>>           <<テーブルB>>
ID 名前  地域コード フラグ   ID  地域コード 地域名
10  あああ     1   true    01          1   北海道
11  いいい     2   false    02          2   東北
12  ううう     3   true        03          3   関東
13  えええ     4   true        04          4   九州


<<テーブルA>>をDataGridViewに表示するのですが、
地域コードの部分は<<テーブルB>>の「地域名」を
表示したいと思っています。
また変更を可能にする為、地域名はComboBox型のセルで
ユーザが選択可能にします。

こんな感じです。(▼はComboBoxセルとお考え下さい。)
-------------------------------------
ID  名前      地域名    フラグ
10  あああ  北海道▼  true
11  いいい   東北▼  false
12  ううう   関東▼  true
13  えええ   九州▼  true
-------------------------------------

ComboBox型のセルのDisplayMemberに<<テーブルB>>の地域名、
ValueMemberに地域コードのフィールド名を指定したのですが、
実行して表示をすると、

「FormatException: DataGridViewComboBoxCellの値が有効ではありません。」

のメッセージが表示されます。

実は、テーブルAの地域コードがvarcharで、
テーブルBの地域コードがintと言う事が発覚し、
これが原因で変換が出来ないのかと推測しています。
(既存部分の兼ね合いでフィールドの型の変更は不可です。)

この推測が当たっている場合、どのようにすれば変換出来るのか、
また外れている場合は何が考えられるかをお教え頂けませんか?

VS2005/C#/.net2.0です。
宜しくお願い致します。

引用返信 編集キー/
■44730 / inTopicNo.2)  Re[1]: DataGridViewのComboBoxセルの変換について
□投稿者/ める (34回)-(2009/12/16(Wed) 18:40:04)
> 実は、テーブルAの地域コードがvarcharで、
> テーブルBの地域コードがintと言う事が発覚し、
> これが原因で変換が出来ないのかと推測しています。
> (既存部分の兼ね合いでフィールドの型の変更は不可です。)

両方のテーブルの地域コードをint同士、varchar同士にして
ちょっと空いているマシンで試してみましたが、
結果は変わらずでした。

DataErrorイベントをハンドルして下さいとのメッセージも
出ていたので(上のメッセージに追加で表示されてました。すみません。)
イベントを追加したところ、エラーダイアログは表示されなくなったのですが、
やはり変換が出来ません。

DataErrorのイベントで手動で変換を掛けなくてはならないのでしょうか?
申し訳ありませんが引き続き返信お待ちしております。



引用返信 編集キー/
■44731 / inTopicNo.3)  Re[2]: DataGridViewのComboBoxセルの変換について
□投稿者/ とも (18回)-(2009/12/16(Wed) 18:55:13)
グリッドのそのコンボ列にテーブルBのデータ(valueを地域コード,dispを地域名)で表示するところまでは問題ないんですよね?

そこにテーブルAの地域コード(valueにその値)をいれるところでエラーになってるってことですか?
引用返信 編集キー/
■44732 / inTopicNo.4)  Re[3]: DataGridViewのComboBoxセルの変換について
□投稿者/ める (35回)-(2009/12/16(Wed) 19:17:44)
レスありがとうございます。

No44731 (とも さん) に返信
> グリッドのそのコンボ列にテーブルBのデータ(valueを地域コード,dispを地域名)で表示するところまでは問題ないんですよね?
>
> そこにテーブルAの地域コード(valueにその値)をいれるところでエラーになってるってことですか?

恐らくそうです。

と、言うのも、DataGridViewのDataErrorイベントを追加し、
そのイベントは空の状態で実行すると・・・

1.実行直後、コンボボックスには「地域コード」が表示されています。
2.コンボボックスを開くと「地域名」のリストがドロップダウンします。
3.選択すると「地域名」が選択されて表示されます。
4.そのコンボボックスからフォーカスが外れると「地域コード」に戻ります。

このような状態から、1.の時点で表示されている「地域コード」は、
<<テーブルA>>のコードがそのまま表示されている。
コンボボックスは「地域名」のリストであるため、地域コードに該当する
データがないため、有効でない値と判断されているのでは・・・と
思っています。

となると、<<テーブルA>>の地域コードがセルに表示される前に、
何らかの方法で日本語に変換してやらないとダメなのでしょうか?
コンボボックスが変換掛けてくれるとばかり思っていたのですが・・・。
引用返信 編集キー/
■44746 / inTopicNo.5)  Re[4]: DataGridViewのComboBoxセルの変換について
□投稿者/ gtk2k (141回)-(2009/12/17(Thu) 01:10:04)
コンボボックスにセットするデータを取得時にデータ型を変換すればいいと思うんだが
SELECT CONVERT(NVARCHAR, PLACE_CODE) AS PLACE_CODE, PLACE_NAME FROM TableB
引用返信 編集キー/
■44757 / inTopicNo.6)  Re[5]: DataGridViewのComboBoxセルの変換について
□投稿者/ める (36回)-(2009/12/17(Thu) 10:58:49)
遅くなりました。レスありがとうございます。

■No44746 (gtk2k さん) に返信
> コンボボックスにセットするデータを取得時にデータ型を変換すればいいと思うんだが
> SELECT CONVERT(NVARCHAR, PLACE_CODE) AS PLACE_CODE, PLACE_NAME FROM TableB

やってみましたが、やはりうまくいきません。
型の違いではないような気がします。

一応抜粋ですが、最低限の部分です。
-------------------------
private void GetDataFromDB()
{
    // データをテーブルから取得する
    dataAdapter.FillDataSet(ds.TableA, "Select * from テーブルA");
    dataAdapter.FillDataSet(ds.TableB, "Select * from テーブルB"); // gtk2kさんのSQL文も試しましたが変わらずです。

    // 各BindingSourceにDBのテーブルをアタッチする
    this.mTableADataTableBindingSource.DataSource = ds.TableA;
    this.mTableBDataTableBindingSource.DataSource = ds.TableB;
}

また、表示させるDataGridViewのComboBoxColumnのプロパティは

[DataPropertyName]:AreaCode(テーブルAの地域コードです)
[DataSource]:mTableBDataTableBindingSource;(テーブルBへのアタッチ用BindingSource)
[DisplayMember]:AreaName(テーブルBの地域名です。)
[ValueMember]:AreaCode(テーブルBの地域コードです)

---------------------------
あまり意味がないかも知れませんが
通常のComboBoxでも同様のテーブルを
アタッチして試してみました・・・

this.ComboBox1.SelectedValue = 1
this.ComboBox1.SelectedValue = "1"

のどちらでも"北海道"と表示されました。

今回の場合はDataGridViewなので、
SelectedValueは関係ないとは思うのですが
内部的に呼ばれていたりしないのかな・・・と。

RowsAddedイベントとかで変換してやる等
しないといけないんでしょうか。
編集後はまたDBに反映させるので、
再変換等あまりしたくはないのですが・・・。

すみませんがもう少し回答お待ちします。

引用返信 編集キー/
■44759 / inTopicNo.7)  Re[6]: DataGridViewのComboBoxセルの変換について
□投稿者/ める (37回)-(2009/12/17(Thu) 11:27:20)
えっと自己解決しました。

>>dataAdapter.FillDataSet(ds.TableB, "Select * from テーブルB"); // gtk2kさんのSQL文も試しましたが変わらずです。

当たり前の事でしたが、ここで使ってるデータセット(ds.TableB)の
地域コードの型がStringのままだったので、Intに変更したところ、
希望の動作をさせる事が出来ました。

なんか一人で慌ててしまってすみませんでした。
レス頂いた皆様ありがとうございましたm(__)m
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -