スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C#] DataGridViewについて

常日頃、DataGridViewについては、悩まされマス。
何回やっても、同じようなところでつまずきます。
そんなに深く知ろうとしないからかもしれません。

ですので、ここにDataGridViewについて、覚えておきたい事を書いていこうと思います。
表面的な部分ですので、もし詳しく知りたい方は、MSDNを参照してください。

以下で記載する物は、すべて下のようなサンプルソースを基準に説明します。

-------------
   Form1                       : 基板となるフォーム
-------------

-------------------
  dataGridView1             : フォームに貼りつけたDataGridView
-------------------

----------------------
   MyClass                    : 適当に作ったクラス。
^^^^^^^^^^^^^^
public string  Name
public int ID
public double Val
public Color col
----------------------

※ サンプルコードを 一番下に載せています。




1. DataBindingについて   

カスタムクラス(ここで言うMyClass)をDataGridViewに表示します。
DataBindingは、非常に使いやすい反面、癖があります。
ここでは、簡単な表示方法を書きます。

1.1 UIによるカスタムクラス配列の簡単実装方法
    1. 以下のようにBindingSourceをツールボックスからD&Dし、
       プロパティの[DataSource][プロジェクトデータソースの追加][オブジェクト]
       にて、カスタムクラスを追加します。

    2. 以下のようにリストを組み、DataSourceに入れてあげます。
       (ここでは、FormLoadイベントでい れています)


private void Form1_Load(object sender, EventArgs e) {

    List<MyClass> lmyCls = new List<MyClass>();

    MyClass myCls = new MyClass("円周率", 0, 3.14, Color.Red);

    lmyCls.Add(myCls);


    dataGridView1.DataSource = lmyCls;

}



以下が、画面です。
DataGridView_BindingSourceResult1



    3. データの追加。
        今回は、List型でデータを持っているので、簡単に
        .Add(xx)でデータ追加できそうですが、
        何故かこれはうまくいきません。(面倒なので詳しくは追求ません。)
        ですので、いちいちListを再生成して更新をしてあげます。
        他にいい方法があると言う方は、ご教授ください(- -|||)""
ただし、データの変更は、特に生成する必要はなさそうです。


private void Form1_Load(object sender, EventArgs e) {

    List<MyClass> lmyCls = new List<MyClass>();

    MyClass myCls = new MyClass("円周率", 0, 3.14, Color.Red);

    lmyCls.Add(myCls);


    dataGridView1.DataSource = lmyCls;


    MyClass myCls1 = new MyClass("オイラー定数", 1, 2.71, Color.Blue);

    lmyCls.Add(myCls1);

    // 以下をしないと更新されない

    dataGridView1.DataSource = new List<MyClass>(lmyCls);

}


以下が画面です。
DataGridView_BindingSourceResult2


      


2. 入力制御について  
例えば、必ず数値型がほしいなどの時に使えます。
キーイベント、データ変更イベント、セル移動イベントなど色々ありますが、
あまりうまくいかないです。
そこで、いいイベントを見つけましたので、そちらを紹介します。

2.1 CellValidatingイベントによる処理
     1. CellValidatingイベントを追加します。
        CellValidatingは、入力データを編集し、
        フォーカスがセルから離れたときに発生するようです。
    
     2. エラー処理を書きます。
        以下のコードで e.FormattedValueにて、
        オブジェクトの値を撮ってきていますが、
        これは、必ずstring型になります。(何故だかはわかりません)
        そこで、数値型の場合は、.TryParseを使います。


private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {

    // 1.編集セルのデータ取得

    // e.FormattedValueの中身は必ず、string型になる。

    // しかし、正常な値が入っていると、DataGridViewが勝手に変更してくれる。

    string str = (string)e.FormattedValue;


    // 2.今回の場合、Columnが1の場合は、整数なので、1の場合の条件を入れる。

    if (e.ColumnIndex == 1) {

        int id = 0;

        // DataGridViewが勝手に変更してくれるので、エラー時のみの処理

        if (!int.TryParse(str, out id)) {

            MessageBox.Show("int型を入れてください");

            // イベントのキャンセル

            e.Cancel = true;

        }

    }

}


      ここでかんの良い方はお気づきかもしれませんが、ここでは
      エラー時の場合しか条件式に加えていません、
      私も、最初(_´Д`) と思いましたが、値が正常な場合、適当にDataGridViewが型の変更を
      してくれているようです。 であれば、書くのも面倒くさいので、任せましょう。ということです。




From1.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;


namespace testform {

    public partial class Form1 : Form {

        public Form1() {

            InitializeComponent();

        }


        private void Form1_Load(object sender, EventArgs e) {

            List<MyClass> lmyCls = new List<MyClass>();

            MyClass myCls = new MyClass("円周率", 0, 3.14, Color.Red);

            lmyCls.Add(myCls);


            dataGridView1.DataSource = lmyCls;


            MyClass myCls1 = new MyClass("オイラー定数", 1, 2.71, Color.Blue);

            lmyCls.Add(myCls1);

            // これをしないと更新されない

            dataGridView1.DataSource = new List<MyClass>(lmyCls);


        }


        private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {

            // 1.編集セルのデータ取得

            // e.FormattedValueの中身は必ず、string型になる。

            // しかし、正常な値が入っていると、DataGridViewが勝手に変更してくれる。

            string str = (string)e.FormattedValue;


            // 2.今回の場合、Columnが1の場合は、整数なので、1の場合の条件を入れる。

            if (e.ColumnIndex == 1) {

                int id = 0;

                // DataGridViewが勝手に変更してくれるので、エラー時のみの処理

                if (!int.TryParse(str, out id)) {

                    MessageBox.Show("int型を入れてください");

                    // イベントのキャンセル

                    e.Cancel = true;

                }

            }

        }


    }

}



MyClass.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing;


namespace testform {

    public class MyClass {


        private string _Name = string.Empty;

        private int _Id = 0;

        private double _Val = 0d;

        private Color _Col = Color.White;


        public string Name { get { return _Name; } set { _Name = value; } }


        public int ID { get { return _Id; } set { _Id = value; } }


        public double Val { get { return _Val; } set { _Val = value; } }


        public Color Col { get { return _Col; } set { _Col = value; } }


        public MyClass(string name, int id, double val, Color col) {

            _Name = name;

            _Id = id;

            _Val = val;

            _Col = col;

        }


    }

}





スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

ss_9

名前 :ss_9
紹介 :
20代はエンジニア、30代はプロ、40代は管理、50代は人脈。

Twitterボタン

最新記事
カテゴリ
AD
月別アーカイブ
RSSリンクの表示
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。