画面はメインとなる 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 イベントで行うのが重要です。