QA@IT

DataGridViewComboBoxColumnで、初期値を表示させたいのです

15380 PV

おはようございます。
お休み中のところ、稚拙な質問で申し訳ないです。
慣れていないので、質問に失礼がありましたら、すいません。

環境は、VisualStudio2013、C#、Windowsフォームです。

DataGridViewComboBoxColumnを継承したctrComboBoxColumnExを作り、その中で、初期値を設定したいのですが、方法がわかりません。

 public class TextValue
    {
        private string _strText = string.Empty;
        private int _intValue = 0;

        public string Text
        {
            get { return _strText; }
            set { _strText = value; }
        }
        public int Value
        {
            get { return _intValue; }
            set { _intValue = value; }
        }
        public TextValue()
        {
        }
        public TextValue(string vstrText, int vintValue)
        {
            _strText = vstrText;
            _intValue = vintValue;

        }
    }

    public class ctrComboBoxColumnEx : DataGridViewComboBoxColumn
    {
        public ctrComboBoxColumnEx()
        {
            Initialize();
        }
        private void Initialize()
       {
           this.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
           this.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
           this.HeaderText = "タイプ";
           this.Items.Add(new TextValue("ラジオボタン", 0));
           this.Items.Add(new TextValue("チェックボックス", 1));
           this.Items.Add(new TextValue("テキストボックス", 2));
           this.Items.Add(new TextValue("テキストエリア", 3));

           this.DisplayMember = "Text";
           this.ValueMember = "Value";

       }

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43660&forum=7&0
を参考に、
this.Valueとしようとしたら、そもそもValueというプロパティがありませんでした。
DataGridView側から、DataGridView1.Rows[1].Cells[1].Value = 1のようにすれば値は入るかと思うのですが、できればDataGridViewComboBoxColumnの内部で完結したいのです。
よろしくお願いします。

また、ColumnとCellの関係がもう一つ分かっていません。表示状態の時のコントロールがCell、編集中の時のコントロールがColumnで良いのでしょうか(説明が下手ですいません)

基本的な質問で、すいません。
以上、よろしくお願いします。

回答

また、ColumnとCellの関係がもう一つ分かっていません。表示状態の時のコントロールがCell、編集中の時のコントロールがColumnで良いのでしょうか

Cellとはマスの事です。Columnは列の事です。
表示状態も編集中状態もCellの状態です。
「DataGridViewComboBoxColumn」はこれが指定された列のセルの枠組みを用意しておくものです。


DataGridViewComboBoxColumnは大枠を決めるもので個々のセルについては守備範囲外と考え、
DataGridViewの CellFormatting イベントをハンドリングして実行時に設定するケースが多いようです。

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {

    if (e.ColumnIndex == 1) // 0の部分はctrComboBoxColumnEx に指定した列のインデックス( 0 始まりの列番号)を指定する
    {
        if (e.Value == DBNull.Value) {
            e.Value = "チェックボックス";
        }
    }
}

今回のDataGridViewComboBoxColumnの中で完結させたいという要望に近そうな解決方法として、InitializeでDefaultCellStyleのNullValueを指定してNull時の表示値を希望の物にしてしまう手もありますが、

this.DisplayMember = "Text";
this.ValueMember = "Value";

this.DefaultCellStyle.NullValue = "チェックボックス"; // この行を追加

ここで指定するのはあくまで「空だったときどう見せるか」というだけで
表示上は変わっているように見えて値の方はnullのままですのであまり良い手であるとは言えません。

前述の通り DataGridViewComboBoxColumnは列全体に関わる事を指定するものなので実際の値に関わることは他のクラスに担当させた方が良い様に思います。

DataGridViewColumn(DataGridViewComboBoxColumnの親クラス)

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridviewcolumn(v=vs.110).aspx

DataGridView のセルの実際のコレクションが格納された DataGridViewRow とは異なり、DataGridViewColumn は、 列の幅やセル スタイルなど、主に列のユーザー インターフェイス (UI) の外観と動作を調整するために使用されます

編集 履歴 (0)
  • flied_onionさん、私の超初歩的な質問に対して、詳しい説明をして頂いて、ありがとうございます。Columnに対して固有の値を設定したりしようとするからいけないのですね。Cellについて調べてみます。 -
  • おはようございます。色々調べたのですが、ColumnやCellの継承で行うやり方というのは、サンプルも少ないですね。DataGridViewを使ってユーザーコントロールを作るという方法が一番無難なようです。ありがとうございました。 -

DataGridViewComboBoxColumn を使うと言うことは、基本にやりたいことは DataGridView に DB から取得したデータを表示して、それをユーザーが DataGridView 上の UI (DataGridViewTextBoxColumn や DataGridViewConboBoxColumn)を使って編集し、編集完了後 DB に更新をかけるということでしょうか? 具体的に言うと、以下のページのチュートリアルの GridView のような感じですか?

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
http://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

そして、Visual Studio のウィザードベースで作ると、全てのセルが DataGridViewTextBoxColumn になるので、一部の列を DataGridViewConboBoxColumn に変更したいと言うことですか? さらに、その際、DataGridViewTextBoxColumn に表示される初期値を、DB から取得した値にしたいということですか?

であれば、以下のページにあるようにしてできると思います。

DataGridView に ComboBox を表示
http://surferonwww.info/BlogEngine/post/2014/01/23/how-to-show-combobox-column-in-datagridview.aspx

初期値は、ウィザードベースで自動生成されたコードの中で、

this.dataGridViewTextBoxColumn3.DataPropertyName = "CategoryID";

のように設定されます。

PS.
上のコードでは名前が dataGridViewTextBoxColumn3 となってますが、上に紹介したページの Step 13 で、DataGridView の列の編集画面で列の ColumnType を DataGridViewComboBoxColumn に変更してます。なので、中身は DataGridViewComboBoxColumn です。ただ、その操作では名前は変わらないのでそうなってます。

編集 履歴 (1)
  • SurferOnWwwさん、ありがとうございます。特に2つ目のリンク、参考になります。
    ただ、今回はDBへのアクセスは無く、ComboBoxColumn(flied_onionさんのコメントを読みますと、Cellの方が正しいようですね)に値を格納する器であるオブジェクトの参照を渡してあげて、そのオブジェクトに設定されている値を初期値として表示したいのです。説明不足ですいません。
    -
ウォッチ

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