画面はメインとなる 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#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : dynamic 型 による Excel へのアクセス
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート
- C# でDXライブラリを使って簡単なシューティングをクラス化して標準化 / メインループとプレイヤー (4)