■配列を使った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);
}
}
▲トップページ