- PR -

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

投稿者投稿内容
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2007-02-02 17:23
イナバさん、こんにちは。
引用:

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


おかしいですね〜。
こちらでは以下のような記述で、背景色問題は回避できていますよ。

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


正確には、代入式に当たるところは別メソッドに飛んで処理しているのですが、やってる事自体は大体変わりませんね。
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-02-02 17:51
梶様こんにちは。
またも早速のお返事、ありがとうございます。

私も同じようにコード記述をしているのですが、
>string taxType = combocon.EditingControlFormattedValue.ToString();
で参照される値がコードのようです。

ということは、GridのComboBox列の設定に問題があるかもしれませんね…

また少し試行錯誤してみます。

お忙しいところ、ありがとうございました。
結果はまたご報告させていただきます…
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-02-05 14:30
こんにちは。
先日投稿させていただいた件ですが、説明不足でした。
引用:

string taxType = combocon.EditingControlFormattedValue.ToString();
dataGridViewRow.Cells["Column名"].Value = taxType;


上記記述ですが、Comboで選択した内容(例えばコード)をそのまま別の列に表示するのではなく、選択したコードに付随するCombo内にバインドされている列(Comboのリスト展開時表示されない)の値(例:名称)を表示したいといった処理内容でした。
申し訳ありません。
しかし名称を代入すると相変わらず、Comboの背景色が黒になってしまいます。

どうやらComboから他行のComboxへ直接移動すると、SelectedIndexChangedを2回通るようで、SelectedIndexChanged後のDrawItem内e.Graphics.DrawStringを最後に通った際背景が黒くなることまでは掴めました。

続きます
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-02-05 14:30
以下がPGです。
引用:
private void XXComboBox_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index == -1)
return;
DataRowView rowview = ((DataRowView)((ComboBox)sender).Items[e.Index]);
 if (rowview == null)
return;
e.DrawBackground();
string str = rowview["列名"].ToString();
if (str == null)
return;
e.Graphics.DrawString(str,
e.Font,
System.Drawing.Brushes.Black,
new RectangleF(e.Bounds.X, e.Bounds.Y,
e.Bounds.Width, e.Bounds.Height));
}



記述間違えでしょうか?
Comboのプロパティも特別何かしてあるというわけではありません。
それともSelectIndexChangedをCombo列を連続して指定した場合、ジャンプする等良い手立て等あれば、よいお知恵を拝借できれば助かります・・・

大変申し訳ございませんが、よろしくお願いいたします
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-02-06 08:59
皆様こんにちは。度々すみません。
現象を追ってみた所以下のようなことがわかりました。

Grid内のCombo→Comboと移動した場合、Focus取得先(移動先)Comboで以下の内容でイベントが処理されました(Aとします)。※Rowは全て変更なし。
@selectIndexChanged
AEditingControlShowing
BDrawItem
CSelectIndexChanged
DDrawItem

対してText→Comboと移動した場合はイベントが以下の内容で処理されました(B)。
@EditingControlShowing
ADrawItem
BSelectIndexChanged
CDrawItem

AB(1つ前レス参照)を繰り返し、最後にあるe.Graphics.DrawString〜の処理後背景が黒い状態でリスト展開されました。
Bは背景色は変わりません

素人推測の域を出ませんが、A@の処理が行われないようにすればうまくいくのでは?と考えていますが、どうでしょうか・・・
A@SelectIndexChangedへ最初に入らないようにする方法はありますでしょうか?

もしご存知の方がいらっしゃったら、ご教授頂ければと思います。
皆様大変お忙しいところ申し訳ございませんが、よろしくお願い致します。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-02-06 09:14
回答でなくてすみませんが…
おそらくなんですが、同じ事象を経験した方があまりいないので、
レスがつけられないのではないでしょうか?
おっしゃる通りの条件で、1からフォームを作って、DataGridViewを貼り付けて
コードを実際に書いて検証して見ればわかるのかも知れませんが、
私も正直、そこまで頑張る気にはなれません。

可能なら再現できる最小のコードを提示して頂けますか?
多少長くなっても、designerファイルの内容も含めて、
必要な部分(おそらくDataGridViewの関係の部分)を
切り取って、できればCODEタグでくくって。
そうすれば検証してくださる方もいると思います。
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-02-07 17:14
こんにちは。
質問方法の要領を得ず、申し訳ありませんでした。
KI様。ご指摘ありがとうございます。今後、気をつけたいと思います。

コードをUPしようかと思ったのですが、まとめてもかなり大きなものになりそうで諦めました。
その為、別Formに同様のGridを配置してテストしたところ、同様の結果が得られました。
それを以下に記載させて頂きます。
以下はコードファイルです。(投稿サイズ制限がある為、分割させていただきます)
イナバ
常連さん
会議室デビュー日: 2007/01/31
投稿数: 37
投稿日時: 2007-02-07 17:16
@
コード:
 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using HAP.Properties;
using HAPLibrary1.Data;
using HAPLibrary1;

namespace HAP
{
    public partial class FormTest : Form
    {
        private CErrorInfo _errinfo = CErrorInfo.GetInstance();	//エラー情報
        private readonly CLoginUserInfo _usrInfo = null;		//ユーザ情報(他のFormから引継)
        private int MAX_MOV = 9;					//MaxRow

        public FormTest(CLoginUserInfo usrInfo)
        {
            _usrInfo = usrInfo;
            InitializeComponent();
            StartPosition = FormStartPosition.CenterParent;
            m_dataGridView.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(m_dataGridView_EditingControlShowing);
            SetGrid();
        }
        private void FormTest_Load(object sender, EventArgs e)
        {
            if (_usrInfo.ChgFctCd == null ||
                _usrInfo.ChgFctCd.Length <= 0)
            {
                return;
            }
            // 移動設備 プルダウンリスト設定
            mTableAdapter .FillByFctMovFclCd(hDataSet.MMOVFCL, _usrInfo.PfctKb + '%');
            if (hDataSet.MMOVFCL.Count <= 0)
            {
                return;
            }
            MOVFCLCD.DataSource = hDataSet.MMOVFCL.DefaultView;
            MOVFCLCD.ValueMember = "ITEMCODE";
            MOVFCLCD.DisplayMember = "ITEMCODE";
        }

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