C#メモ Excelのウィンドウ枠の固定みたいにDataGridViewをスクロールしても行と列を固定で表示するようにしてみる

C#

知ってればとっても簡単だった…。

  • 固定したい行のDataGridView.Columns.Frozenプロパティをtrueにする
  • 固定したい列のDataGridView.Rows.Frozenプロパティをtrueにする

まずは、フォームはこんな感じ。
真ん中にDataGridViewを配置しといてDockプロパティをFillにしといた。

んで、コードはこんな感じ。
コードはフォームのLoadイベントに実装。

/// <summary>
/// フォームがロードされたときのアクション
/// </summary>
/// <param name="sender">アクションをしたオブジェクト</param>
/// <param name="arguments">オブジェクトの引数</param>
private void OnLoad(object sender, EventArgs arguments)
{
	try
	{
		//
		// サンプルデータを作成する
		// ※Excel風に行を数値、列を英字で表現することにして
		// ※A1~Z99までをセルの値として設定する
		//
		for (int column = Convert.ToInt32('a'); column < Convert.ToInt32('z'); column++)
		{
			MainDataGridView.Columns.Add(Convert.ToChar(column).ToString(), Convert.ToChar(column).ToString());
		}
		for(int row =1;row<100; row++)
		{
			List<string> line = new List<string>();
			for(int column = Convert.ToInt32('a'); column < Convert.ToInt32('z'); column++)
			{
				string cell = Convert.ToChar(column).ToString() + row;
				line.Add(cell);
			}
			MainDataGridView.Rows.Add(line.ToArray());
		}

		// 
		// 1行目と1列目を固定する
		// ※テーブルを作成する前にプロパティを設定すると例外が投げられるので注意!
		//
		MainDataGridView.Rows[0].Frozen = true;
		MainDataGridView.Columns[0].Frozen = true;
	}
	catch(Exception exception)
	{
		MessageBox.Show(exception.Message);
	}
	finally
	{
	}
}

で、実行してみるとこんな感じ。
フォームを表示するとこんな感じで表示してて…。

スクロールバーでテーブルの左上が見切れるように表示を変更すると1行目と1列目が表示されたままになっとる。

ちなみに、Frozenプロパティを指定した行番号や列番号がDataGridViewにある行数あるいは行数の範囲をこえて設定しようとすると例外が発生する…。
なので、DataGridViewでテーブルを作ってからプロパティを設定する方がいいかも。

そんなこんなで、明日への自分へのメモってことで。