|
> デリゲート宣言した「PreCheck」のインスタンスをどこで(Form1_Loadイベントで?)どのようにコーディングしたら良いのか、などが分からずにおります。
> 大変恐縮ですが、ご教示をお願いできませんでしょうか?
デリゲート宣言は、新しい型を定義するイメージです。
メソッドの戻り値の型、引数の型及び数を定義します。
「PreCheck」を宣言しただけでは、新しい型を定義しただけにすぎませんので、PreCheck型の変数を用意する必要があります。
簡単に言うと、
・DataGridViewに検証メソッドのデリゲート宣言
・Form側でDataGridViewの検証メソッドへのデリゲートを設定
を実装します。
当方、VBの知識があまりありませんので、またまたC#で失礼しますが、ご参考になれば。
// Form
public Form1()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// CstDataGridViewの検証処理にPreCellValidatingメソッドを設定します。
this.cstDataGridView1.PreCheckProc = this.PreCellValidating;
}
// 検証に使用するメソッド
// 戻り値、引数の型を CstDataGridView.PreCheckと合わせます。
private bool PreCellValidating(int col, int row)
{
int i;
return int.TryParse((string)this.cstDataGridView1[col, row].EditedFormattedValue, out i);
}
}
// Formここまで
// CstDataGridView
public partial class CstDataGridView : DataGridView
{
// 検証メソッドのデリゲート宣言
public delegate bool PreCheck(int colIndex, int rowIndex);
public CstDataGridView()
{
InitializeComponent();
}
public CstDataGridView(IContainer container)
{
container.Add(this);
InitializeComponent();
}
// 検証メソッドを設定する変数
public PreCheck PreCheckProc
{
get;
set;
}
protected override bool ProcessDialogKey(Keys keyData)
{
// 不正な入力の場合は通常処理
// 検証メソッドへのデリゲートが設定されている場合は検証処理を実行します。
if (this.PreCheckProc != null && this.PreCheckProc(this.CurrentCell.ColumnIndex, this.CurrentCell.RowIndex) == false)
{
return base.ProcessDialogKey(keyData);
}
if ((keyData == (Keys.Tab | Keys.Shift)) || (keyData == (Keys.Enter | Keys.Shift)))
{
DataGridViewCell nextCell = GetPrevCell();
if (nextCell == null)
{
this.Parent.SelectNextControl(this, false, true, true, true);
}
else
{
this.CurrentCell = nextCell;
}
return true;
}
else if (keyData == Keys.Tab || keyData == Keys.Enter)
{
DataGridViewCell nextCell = GetNextCell();
if (nextCell == null)
{
this.Parent.SelectNextControl(this, true, true, true, true);
}
else
{
this.CurrentCell = nextCell;
}
return true;
}
else
{
return base.ProcessDialogKey(keyData);
}
}
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
// 編集状態では呼ばれないのでチェック不要
if ((e.KeyData == (Keys.Tab | Keys.Shift)) || (e.KeyData == (Keys.Enter | Keys.Shift)))
{
DataGridViewCell nextCell = GetPrevCell();
if (nextCell == null)
{
this.Parent.SelectNextControl(this, false, true, true, true);
}
else
{
this.CurrentCell = nextCell;
}
return true;
}
else if (e.KeyData == Keys.Tab || e.KeyData == Keys.Enter)
{
DataGridViewCell nextCell = GetNextCell();
if (nextCell == null)
{
this.Parent.SelectNextControl(this, true, true, true, true);
}
else
{
this.CurrentCell = nextCell;
}
return true;
}
return base.ProcessDataGridViewKey(e);
}
protected override void OnCellValidating(DataGridViewCellValidatingEventArgs e)
{
if (this.IsCurrentCellDirty)
{
// 検証へのデリゲートが設定されている場合は検証処理を実行します。
if (this.PreCheckProc != null && this.PreCheckProc(e.ColumnIndex, e.RowIndex) == false)
{
e.Cancel = true;
}
}
base.OnCellValidating(e);
}
private DataGridViewCell GetNextCell()
{
if (this.CurrentCell == null)
{
return null;
}
for (int row = this.CurrentCell.RowIndex; row < this.RowCount; row++)
{
for (int col = 0; col < this.ColumnCount; col++)
{
if (row == this.CurrentCell.RowIndex && col <= this.CurrentCell.ColumnIndex)
{
continue;
}
if (this[col, row].ReadOnly)
{
continue;
}
return this[col, row];
}
}
return null;
}
private DataGridViewCell GetPrevCell()
{
if (this.CurrentCell == null)
{
return null;
}
for (int row = this.CurrentCell.RowIndex; row >= 0; row--)
{
for (int col = this.ColumnCount - 1; col >= 0; col--)
{
if (row == this.CurrentCell.RowIndex && col >= this.CurrentCell.ColumnIndex)
{
continue;
}
if (this[col, row].ReadOnly)
{
continue;
}
return this[col, row];
}
}
return null;
}
}
// CstDataGridViewここまで
|