■配列を使ったDataGridの利用

CustomDataGrid DataGrid1= new CustomDataGrid("dataset1","table1");

private void Form1_Load(object sender, System.EventArgs e)
{
	panel1.BorderStyle = BorderStyle.FixedSingle;
	panel1.Controls.Add(DataGrid1);

	System.Windows.Forms.DataGridTextBoxColumn[] dgColumnStyle1=new System.Windows.Forms.DataGridTextBoxColumn[4];
	// テーブルの列のスタイルを作成
	dgColumnStyle1[0] = new ColorDataGridTextBoxColumn();
	dgColumnStyle1[1] = new System.Windows.Forms.DataGridTextBoxColumn();
	dgColumnStyle1[2] = new System.Windows.Forms.DataGridTextBoxColumn();
	dgColumnStyle1[3] = new System.Windows.Forms.DataGridTextBoxColumn();

	//列の幅を決定
	dgColumnStyle1[0].Width = 100;
	dgColumnStyle1[1].Width = 50;
	dgColumnStyle1[2].Width = 50;
	dgColumnStyle1[3].Width = 50;

	//列の右ぞろえ、中央ぞろえ、左ぞろえを設定
	dgColumnStyle1[0].Alignment = System.Windows.Forms.HorizontalAlignment.Center;
	dgColumnStyle1[1].Alignment = System.Windows.Forms.HorizontalAlignment.Left;
	dgColumnStyle1[2].Alignment = System.Windows.Forms.HorizontalAlignment.Right;
	dgColumnStyle1[3].Alignment = System.Windows.Forms.HorizontalAlignment.Right;

	//ヘッダーのテキストを設定
	dgColumnStyle1[0].HeaderText = "いなば";
	dgColumnStyle1[1].HeaderText = "てすと";
	dgColumnStyle1[2].HeaderText = "こんにちは";
	dgColumnStyle1[3].HeaderText = "世界";

	//配列を利用する初期化
	DataGrid1.initAr(dgColumnStyle1);
}

//何度でも読み出して表の値を書き換えられます。
private void GridShow(CustomDataGrid dg)
{
	//重い処理の可能性があるためカーソルを砂時計に換える
	Cursor BkCur= Cursor.Current; //現在のカーソルを取っておく
	Cursor.Current = Cursors.WaitCursor; //砂時計カーソルに入れ替える

	//先頭行を取得
	//int line = dg.GetTopRow();
	//int cell = dg.CurrentCell.RowNumber;
	//選択セルを設定
	dg.lineSelected(0);

	//データグリッドの更新前に列ヘッダーによるソートを保存する
	bool sortpos = dg.TableStyles[dg.dataTable.TableName].AllowSorting;
	dg.TableStyles[dg.dataTable.TableName].AllowSorting = false;

	//テーブルの要素を消去
	dg.dataTable.Rows.Clear();

	//テーブルにデータを追加
	int i;
	for(i = 0;i<100;i++)
	{
		dg.dataTable.Rows.Add(new string[] {"今日は"+i.ToString(), "せいてん", i.ToString(),i.ToString()});
	}
	//データグリッドにテーブルを表示する
	dg.SetDataBinding(dg.dataSet,dg.dataTable.TableName);

	//列ヘッダーによるソートを復元する
	dg.TableStyles[dg.dataTable.TableName].AllowSorting = sortpos;
	//選択セルを復元
	//dg.lineSelected(cell);
	//先頭行を復元
	//dg.SetTopRow(line);
	Cursor.Current = BkCur; //取っておいたカーソルに戻す
}

-------------------------------------------------------------------------------
■データベースを使ったDataGridの利用


CustomDataGrid DataGrid1= new CustomDataGrid("dataset1","table1");

private string connectionString = "Provider=SQLOLEDB.1;Data Source=localhost,4004;Persist Security Info=True;User ID=sa;Password=;Initial Catalog=test;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False";
private System.Data.OleDb.OleDbConnection oConn = new System.Data.OleDb.OleDbConnection();
private System.Data.OleDb.OleDbDataAdapter dataAdapter1 = new System.Data.OleDb.OleDbDataAdapter();
private System.Data.OleDb.OleDbCommand command1 = new System.Data.OleDb.OleDbCommand();

private void Form1_Load(object sender, System.EventArgs e)
{
	oConn.ConnectionString = connectionString;

	panel1.BorderStyle = BorderStyle.FixedSingle;
	panel1.Controls.Add(DataGrid1);

	System.Windows.Forms.DataGridTextBoxColumn[] dgColumnStyle1=new System.Windows.Forms.DataGridTextBoxColumn[4];
	// テーブルの列のスタイルを作成
	dgColumnStyle1[0] = new ColorDataGridTextBoxColumn();
	dgColumnStyle1[1] = new System.Windows.Forms.DataGridTextBoxColumn();
	dgColumnStyle1[2] = new System.Windows.Forms.DataGridTextBoxColumn();
	dgColumnStyle1[3] = new System.Windows.Forms.DataGridTextBoxColumn();

	//DBのフィールド名を設定する
	dgColumnStyle1[0].MappingName = "field1";
	dgColumnStyle1[1].MappingName = "field2";
	dgColumnStyle1[2].MappingName = "field3";
	dgColumnStyle1[3].MappingName = "field4";

	//列の幅を決定
	dgColumnStyle1[0].Width = 100;
	dgColumnStyle1[1].Width = 50;
	dgColumnStyle1[2].Width = 50;
	dgColumnStyle1[3].Width = 50;

	//列の右ぞろえ、中央ぞろえ、左ぞろえを設定
	dgColumnStyle1[0].Alignment = System.Windows.Forms.HorizontalAlignment.Center;
	dgColumnStyle1[1].Alignment = System.Windows.Forms.HorizontalAlignment.Left;
	dgColumnStyle1[2].Alignment = System.Windows.Forms.HorizontalAlignment.Right;
	dgColumnStyle1[3].Alignment = System.Windows.Forms.HorizontalAlignment.Right;

	//ヘッダーのテキストを設定
	dgColumnStyle1[0].HeaderText = "いなば";
	dgColumnStyle1[1].HeaderText = "てすと";
	dgColumnStyle1[2].HeaderText = "こんにちは";
	dgColumnStyle1[3].HeaderText = "世界";

	//SQLを利用する初期化
	DataGrid1.initSql(dgColumnStyle1);
}

//何度でも読み出して表の値を書き換えられます。
private void GridShow(CustomDataGrid dg)
{
	//重い処理の可能性があるためカーソルを砂時計に換える
	Cursor BkCur= Cursor.Current; //現在のカーソルを取っておく
	Cursor.Current = Cursors.WaitCursor; //砂時計カーソルに入れ替える

	//先頭行を取得
	//int line = dg.GetTopRow();
	//int cell = dg.CurrentCell.RowNumber;
	//選択セルを設定
	dg.lineSelected(0);

	//データグリッドの更新前に列ヘッダーによるソートを保存する
	bool sortpos = dg.TableStyles[dg.dataTable.TableName].AllowSorting;
	dg.TableStyles[dg.dataTable.TableName].AllowSorting = false;

	//テーブルの要素を消去
	dg.dataTable.Rows.Clear();

	command1.Connection = oConn;
	command1.CommandText = "SELECT TOP 1000 * FROM table1";
	//SQL文を実行し、データを取得する
	dataAdapter1.SelectCommand = command1;
	dataAdapter1.Fill(dg.dataSet, dg.dataTable.TableName);

	//データグリッドにテーブルを表示する
	dg.SetDataBinding(dg.dataSet,dg.dataTable.TableName);

	//列ヘッダーによるソートを復元する
	dg.TableStyles[dg.dataTable.TableName].AllowSorting = sortpos;
	//選択セルを復元
	//dg.lineSelected(cell);
	//先頭行を復元
	//dg.SetTopRow(line);
	Cursor.Current = BkCur; //取っておいたカーソルに戻す
}

-------------------------------------------------------------------------------
■上記コードで利用するクラス


using System;
//DataGridコントロールには動的にスクロールを変化させるメソッドがないため、
//継承して新しいコントロールの作成
//It succeeds and DataGrid control is created.

public class CustomDataGrid : System.Windows.Forms.DataGrid 
{
	//タブキーを押されたときのフォーカス移動先
	private System.Windows.Forms.Control mControl;
	//ヘッダに線を引く
	public bool headerLine = true;
	//フォント
	//DataGrid1.Font = this.Font;

	public System.Data.DataSet dataSet;
	public System.Data.DataTable dataTable;
	public System.Windows.Forms.DataGridTableStyle TableStyle;

	public CustomDataGrid(string datasetName,string tableName)
	{
		//データセット、データテーブルを作成
		dataSet = new System.Data.DataSet(datasetName);
		dataTable = dataSet.Tables.Add(tableName);
		// テーブルのスタイルを作成
		TableStyle = new System.Windows.Forms.DataGridTableStyle();
		TableStyle.MappingName = dataTable.TableName;
		this.TableStyles.Add(TableStyle);

		//新しい行の追加、編集、削除を禁止する
		//this.ReadOnly = true;
		//Captionの表示を消します
		this.CaptionVisible = false;
		//タブキーを押されたときのフォーカス移動先
		this.mControl=this;
		//行のヘッダーを表示
		this.ColumnHeadersVisible = true;
		//コントロールを広げて貼り付けます
		this.Dock = System.Windows.Forms.DockStyle.Fill;
		//ボーダースタイル
		this.BorderStyle = System.Windows.Forms.BorderStyle.None;
		// *** 列ヘッダーによるソートを禁止 ***
		TableStyle.AllowSorting = false;
		//列のヘッダを消す
		TableStyle.RowHeadersVisible = false;
		//ラインカラーの変更
		TableStyle.GridLineColor = System.Drawing.Color.Black;
		//1行おきに色をつける
		TableStyle.AlternatingBackColor = System.Drawing.Color.FromArgb(220, 255, 255);

		//イベントを追加する
		this.Scroll += new EventHandler(this.CustomDataGrid_Scroll);
		this.Paint += new System.Windows.Forms.PaintEventHandler(this.CustomDataGrid_Paint);
	}

	//配列を利用する場合のDataGridの作成と初期化、一度しか読み出せません
	public void initAr(System.Windows.Forms.DataGridColumnStyle[] ColumnStyle)
	{
		for(int i=0;i<ColumnStyle.Length;i++)
		{
			ColumnStyle[i].MappingName = dataTable.Columns.Add().ColumnName;
			TableStyle.GridColumnStyles.Add(ColumnStyle[i]);
		}
	}

	//SQLを利用する場合のDataGridの作成と初期化、一度しか読み出せません
	public void initSql(System.Windows.Forms.DataGridColumnStyle[] ColumnStyle)
	{
		for(int i=0;i<ColumnStyle.Length;i++)
		{
			//ColumnStyle[i].MappingName = dataTable.Columns.Add().ColumnName;
			TableStyle.GridColumnStyles.Add(ColumnStyle[i]);
		}
	}

	//指定行を選択します
	//A specification line is chosen.
	public void lineSelected(int LineNo)
	{
		if(0<dataTable.Rows.Count && LineNo<dataTable.Rows.Count)
		{
			this.CurrentCell = new System.Windows.Forms.DataGridCell(LineNo, 0);
			//		for(int i = 0;this.dataTable.Rows.Count >i;i++)
			//		{
			//			this.UnSelect(i);
			//		}
			this.Select(LineNo);
			this.Refresh();
		}
	}

	//DataGridの先頭に表示される行を設定する
	//The line displayed at the head of DataGrid is set up.
	public void SetTopRow(int rowNum)
	{
		if(rowNum<dataTable.Rows.Count)
		{
			GridVScrolled(this, new System.Windows.Forms.ScrollEventArgs(System.Windows.Forms.ScrollEventType.LargeIncrement, rowNum));
		}
	}

	//DataGridの先頭に表示される行を取得する
	public int GetTopRow()
	{
		return VertScrollBar.Value;
	}

	//横向きのスクロールを設定する
	//Sideways scrolling is set up.
	public void HScrollSet(int rowNum)
	{
		GridHScrolled(this, new System.Windows.Forms.ScrollEventArgs(System.Windows.Forms.ScrollEventType.LargeIncrement, rowNum));
	}
	//DataGridの横スクロールを取得します
	//Horizontal scrolling of DataGrid is acquired.
	public System.Windows.Forms.ScrollBar getHScroll()
	{
		return HorizScrollBar;
	}
	//DataGrid内のセルでタブキーを押された時に、ほかのコントロールにフォーカスを移動します
	//When a tab key is pushed in the cell in DataGrid, a focus is moved to other control.
	public System.Windows.Forms.Control NextControl
	{
		get
		{
			return mControl;
		}
		set
		{
			mControl = value;
		}
	}

	const int WM_KEYDOWN  = 0x100;
	protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
	{
		if( msg.Msg == WM_KEYDOWN )
		{
			if (keyData == System.Windows.Forms.Keys.Tab)
			{
				mControl.Focus();
				return true;
			}
			else
			{
				return base.ProcessCmdKey(ref msg,keyData);
			}
		}
		return base.ProcessCmdKey(ref msg,keyData);
	}


	private void CustomDataGrid_Paint(Object sender,System.Windows.Forms.PaintEventArgs e)
	{
		//ヘッダーに線を引くことができないため自分で描画します。
		if(headerLine)
		{
			int height = this.Font.Height + 5;
			int width = 0 - getHScroll().Value;
			int i  = 0;

			for(i = 0;i<=this.Controls.Count - 3;i++)
			{
				width += this.TableStyles[0].GridColumnStyles[i].Width;

				//縦線ラインを引きます
				e.Graphics.DrawLine(new System.Drawing.Pen(this.TableStyles[0].GridLineColor),new System.Drawing.PointF(width - 1, 0),new System.Drawing.PointF(width - 1, height));
			}
			//横線ラインを引きます
			e.Graphics.DrawLine(new System.Drawing.Pen(this.TableStyles[0].GridLineColor),new System.Drawing.PointF(0, height),new System.Drawing.PointF(width - 1, height));
		}

		//一行単位の選択に変更
		//It changes into selection of a party unit.
		if(!(dataTable.Rows.Count <= 0))
		{
			System.Windows.Forms.DataGridCell Cell;
			Cell = CurrentCell;
			//  .RowNumber     The selected sequence
			//  .ColumnNumber The selected sequence
			this.Select(Cell.RowNumber); //A line is chosen.
		}
	}

	private void CustomDataGrid_Scroll(Object sender,System.EventArgs e)
	{
		this.Refresh();
	}

	protected override void OnMouseWheel(System.Windows.Forms.MouseEventArgs e)
	{
		base.OnMouseWheel(e);
		base.Focus();
	}
}

public class ColorDataGridTextBoxColumn : System.Windows.Forms.DataGridTextBoxColumn
{
	//Paintメソッドをオーバーライドする
	protected override void Paint(System.Drawing.Graphics g,System.Drawing.Rectangle bounds,System.Windows.Forms.CurrencyManager source,int rowNum,System.Drawing.Brush backBrush,System.Drawing.Brush foreBrush,bool alignToRight)
	{
		if(base.DataGridTableStyle.DataGrid.CurrentCell.RowNumber != rowNum)
		{
			foreBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);
			backBrush = new System.Drawing.SolidBrush(System.Windows.Forms.Form.DefaultBackColor);
		}
		base.Paint(g, bounds, source, rowNum,backBrush, foreBrush, alignToRight);
	}
}




▲トップページ