- PR -

C# Grid内のComboBoxの背景色が勝手に変更される

投稿者投稿内容
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-01-31 11:34
こんにちは。
VS2005 C#(WindowsForm)にてSystem.Windows.Forms.DataGridを使用しています。

FormにTabControlを配置、その中ににGridを作成し、そのGrid内にあるComobBoxが初回の一回目の選択時(ドロップダウンリスト表示)時には背景色が白・文字が黒(標準)で表示されるのですが、そのComboから直接他の行のComboをクリックすると何故か背景色が黒になってしまいます。文字は黒のままです。
リスト背景色は白で統一したいのですが、以降どのComboBoxも背景が黒となってしまいます。
GridやGrid内Comboでは特に背景色の設定は行っていません。
逆に強制的に背景色を白で指定しても同様の現象が起きます。
但し同じGrid内にあるTextBoxを入力、再度Comboへ戻ると背景色はまた白へ戻ります。
この現象が起きるGridは8明細固定で、他の1行ずつ新規行が追加されるGrid形式の場合には発生しないようです。

説明がつたなく申し訳ございませんが、ご教授よろしくお願いいたします。
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2007-01-31 14:16
えっと、もしかして「EditingControlShowing」イベントの中で、対象のComboBoxに対しイベントの追加とかしてます?

自分も以前、「EditingControlShowing」イベントの中で、ComboBoxに対し「SelectedIndexChanged」イベントを追加し、「SelectedIndexChanged」イベント内でDataGridViewの階層の深いところのプロパティを取得しようとすると、同じ現象が出た事があります。

この時は、DataGridViewを直接使用せず、イベントの引数「object sender」を利用して以下のように選択された値や、カレント行等を取得するようにして対応しました。

コード:
//入力コントロールを取得
DataGridViewComboBoxEditingControl combocon = (DataGridViewComboBoxEditingControl)sender;
//入力コントロールからDataGridViewを取得
DataGridView grid = combocon.EditingControlDataGridView;
//カレント行を取得
DataGridViewRow dataGridViewRow = grid.CurrentRow;
//選択された値を取得
string taxType = combocon.EditingControlFormattedValue.ToString();


イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-01-31 15:56
早速のお返事ありがとうございます。
確かに「EditingControlShowing」内でComboBoxに対してイベントの追加をしています。

いただいたコードを元に、先ほどからテストしているのですが思うようにいきません。
確かに、[DataGridView_EditingControlShowing]イベント内の[combo_SelectedIndexChanged]イベントをテスト的にコメントにしたら、背景が黒くならなくなりました。(当然ですがSelectedIndexChanged内でIndexのセットを行っているため、その処理は動かなくなりましたが…)
その為、原因は恐らく梶様が仰る内容と思われます。

送信制限がある為、以下続きます。
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-01-31 15:58
初心者の為、愚かな質問かもしれませんが、再度質問させて下さい。
=====
この時は、DataGridViewを直接使用せず、イベントの引数[object sender]を利用
して以下のように選択された値や、カレント行等を取得するようにして対応しました
=====
教えて下さったコードはどのイベントへ追加したらよろしいのでしょうか?
ComboBoxのイベントは[DrawItem][SelectedIndexChanged]しか設定していません。
上記2つではテストを行いましたが、良い結果が得られません。
私の追加の方法が悪いのかもしれませんが、または別のイベントでしょうか?

お忙しいところ大変申し訳ございませんが、ご教授いただけないでしょうか?
お願いいたします。
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2007-01-31 16:13
引用:

教えて下さったコードはどのイベントへ追加したらよろしいのでしょうか?



自分の場合は、前述の通り「SelectedIndexChanged」イベントの中の記述を変更しました。

ちなみに、何処に記述したかが問題ではなく、何処の値をどのようにしてアクセス(使用)しているかが問題だと思います。
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-01-31 17:40
お忙しい中お返事下さり、ありがとうございました。

引用:
ちなみに、何処に記述したかが問題ではなく、何処の値をどのようにしてアクセス(使用)しているかが問題だと思います。



DataGridViewを参照して書かれている部分をsenderを使用したコーディングするわけですね。

少し色々試してみようと思います。
また進展や結果等ありましたら、書き込みさせていただきます。
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-02-02 12:11
こんにちは。

先日教えていただいたコードを参考にComboBoxの「SelectedIndexChanged」イベントを修正してみました。そのところ、リスト背景色が黒に変更されず、正常に表示されるようになりました。
ありがとうございます。

ところで、この続きになってしまうかもしれませんが、このComboBoxにはマスタがバインドされているのですが、その中の名称を同じGrid内同行のTextBoxに表示させたいと考えています。
簡単に言いますと、ComboBoxでコードを選択し、TextBoxに名称を表示するといった感じです。

この際左辺の指定の仕方が悪いのか、値代入を行うと、名称は表示されるものの、再度ComboBoxの背景が黒になってしまいました。

左辺は以下のような設定を試してみました。
・dataGridViewRow.Cells[X].Value(上記引用変数参照)
・grid.CurrentRow.Cells[X].Value(上記引用変数参照)
・grid[X, X].Value(上記引用変数参照)
・XXX_dataGridView_Grid.CurrentRow.Cells[0].value(頭はGrid名)
・XXX_dataGridView[X, X].Value(頭はGrid名)

続きます。
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-02-02 12:12
記述を若干変えて階層を浅くして試したりもしたのですが、変わりませんでした。
この値代入行を削除すると、リストの背景は変わりません(白のままです)。

ComboBoxの背景色を変えず、イベント内で同じGrid内にあるTextBoxへ値を代入する方法はございますでしょうか?
これは左辺の指定の仕方が悪いのでしょうか…

大変申し訳ございませんが、ご教授下さい。
よろしくお願いいたします。

スキルアップ/キャリアアップ(JOB@IT)