SQLの窓

2018年06月12日


C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )



画面はメインとなる DataGridView を最初に作成して Dock を Fill にします。Fill を設定したコントロールの上下にコントロールを使用する場合は、レイアウトは見たままでは無く Fill にしたものを一番上に置いて他のコントロールを下にします。



ステータスバー、ツールバー、メニューバーと順序が見ている位置と逆にして、それぞれの Dock プロパティを設定します。( ステータスとメニューはデフォルトで OK )

DataGridView のプロパティは重要なので以下に設定内容を自動作成されたコードで示します
            this.dataGridView1 = new System.Windows.Forms.DataGridView();

            this.dataGridView1.AllowUserToAddRows = false;
            this.dataGridView1.AllowUserToDeleteRows = false;
            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.dataGridView1.Location = new System.Drawing.Point(0, 49);
            this.dataGridView1.MultiSelect = false;
            this.dataGridView1.Name = "dataGridView1";
            this.dataGridView1.ReadOnly = true;
            this.dataGridView1.RowTemplate.Height = 21;
            this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
            this.dataGridView1.Size = new System.Drawing.Size(813, 407);
            this.dataGridView1.TabIndex = 0;
            this.dataGridView1.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellDoubleClick);

            public System.Windows.Forms.DataGridView dataGridView1;
ハイライトの行は、最初に設定する3つの編集を許可するかどうかのプロパティで、全て使用不可にしています。

1) 選択は単一行にする : MultiSelect = false
2) 選択表示は行全体にする : SelectionMode = FullRowSelect
3) 行のダブルクリックイベントは、CellDoubleClick で行う
4) Form2 から直接参照可能なように、public で定義する( Modifiers = Public )

次に、Form1 のソースコードですが、表示するデータは環境変数の一覧を使用しています( 実際に変更せずに DataGridView にデータを戻すまでの処理を行います )
    public partial class Form1 : Form
    {
        private DataTable table;
        private DataColumn column;
        private DataRow row;
        private Form nextWindow;

        public Form1()
        {
            InitializeComponent();
        }

        // ツールバーのボタンをクリック
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            // DataTable の作成
            table = new DataTable("EnvironmentVariables");

            // 列情報 の作成
            column = new DataColumn();
            column.DataType = Type.GetType("System.String");
            column.ColumnName = "環境変数";
            table.Columns.Add(column);

            // 列情報 の作成
            column = new DataColumn();
            column.DataType = Type.GetType("System.String");
            column.ColumnName = "値";
            table.Columns.Add(column);

            // 環境変数一覧より、行情報の作成
            foreach (DictionaryEntry dict in Environment.GetEnvironmentVariables())
            {
                row = table.NewRow();
                row["環境変数"] = dict.Key;
                row["値"] = dict.Value;
                table.Rows.Add(row);
            }

            // データーソース経由で DataGridView を表示
            dataGridView1.DataSource = table;
            // 第一カラムでソート
            dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
            // 自動整列
            dataGridView1.AutoResizeColumns();

        }

        // 行をダブルクリックしてダイアログを表示
        private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            int rowNumber = e.RowIndex;
            if (rowNumber < 0 ){
                return;
            }

            // 行=>列=>からの参照
            string value = dataGridView1.Rows[rowNumber].Cells["値"].Value.ToString();
            Console.WriteLine(value);

            // モーダルダイアログとして開く
            using (nextWindow = new Form2(rowNumber))
            {
                nextWindow.ShowDialog(this);
            }

        }
    }


DataTable の考え方は、SQL 文の cerate tableを実行して列の定義を行った上で、テーブルに行を追加して行くというものです。そのテーブル情報全てを DataSource にセットする事で DataGridView への表示が完了します。

※ 列のタイトルは、ColumnName にセットされた内容が表示されます

そして、行をダブルクリックして 行=>列=>からの参照でデータを取得していますが、ここでは確認の為に表示しているだけで、実際は Form2 から直接に [列,行] という形で参照しています。
    public partial class Form2 : Form
    {
        private int rowNumber;
        private DataGridView grid;

        // コンストラクタで処理する行を渡す
        public Form2(int rowNumber)
        {
            this.rowNumber = rowNumber;
            InitializeComponent();

        }

        // データ変更ボタンで親内の DataGridView を直接変更
        private void button1_Click(object sender, EventArgs e)
        {
            grid["値", rowNumber].Value = textBox2.Text;
            grid["値", rowNumber].Style.BackColor = Color.Pink;

            Console.WriteLine("表示データを書き換えました");
            this.Close();
        }

        // キャンセル( フォームのデフォルトボタン )
        private void button2_Click(object sender, EventArgs e)
        {
            Console.WriteLine("キャンセルされました");
            this.Close();
        }

        // 初期フォーカス
        private void Form2_Shown(object sender, EventArgs e)
        {
            textBox1.Focus();

        }

        // 親フォームからの情報を取得
        private void Form2_Load(object sender, EventArgs e)
        {
            grid = ((Form1)Owner).dataGridView1;
            textBox1.Text = grid["環境変数",rowNumber].Value.ToString();
            textBox2.Text = grid["値",rowNumber].Value.ToString();

        }
    }

親フォームの参照は、Owner プロパティを使用し、初期フォーカスの設定を Shown イベントで行うのが重要です。




【VS(C#)の最新記事】
posted by lightbox at 2018-06-12 12:42 | VS(C#) | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり