[C#.NET][Winform][ADO.NET] 依條件設定 DataGridView.CurrentCell 焦點
目前有一個需求,使用者對DataGridView中的儲存格輸入字串,若字串條件不符合規則,輸入焦點需停在該儲存格,其他儲存格不得輸入,待該儲存格符合條件後,焦點方能離開該儲存格。
要達到這功能主要需要兩個事件CellEndEdit、SelectionChanged
1.由CellEndEdit事件判斷儲存格內的資料,是否吻合我們所需要的條件,若條件不符合則用_PreviousViewCell變數記錄錯誤的儲存格。
2.使用SelectionChanged事件,不論滑鼠鍵盤點到哪裡,DataGridView將回到錯誤的儲存格編輯。
DataGridViewCell _PreviousViewCell = null;
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
DataGridView currentView = (DataGridView)sender;
if (currentView == null)
return;
if (e.RowIndex == -1)
return;
string value = "";
float data = 0;
bool IsError = false;
//1.判斷儲存格內的條件
if (currentView.CurrentCell.Value == null)
{
currentView.CurrentCell.ErrorText = "不得為空";
IsError = true;
}
else
{
value = currentView.CurrentCell.Value.ToString();
if (value == "")
{
currentView.CurrentCell.ErrorText = "不得為空";
IsError = true;
}
else
{
currentView.CurrentCell.ToolTipText = data.ToString();
currentView.CurrentCell.ErrorText = "";
IsError = false;
}
}
//記錄錯誤的儲存格
if (IsError == true)
{
this._PreviousViewCell = currentView.CurrentCell;
dataGridView1.CurrentCell = this._PreviousViewCell;
}
else
{
this._PreviousViewCell = null;
}
}
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (_PreviousViewCell == null)
{
return;
}
try
{
this.dataGridView1.CurrentCell = this._PreviousViewCell;
this.dataGridView1.CurrentCell.Selected = true;
this.dataGridView1.BeginEdit(true);
}
catch (Exception)
{
}
}
看似簡單的一個功能,卻困擾了我很久,我今天也花了一個下午才將此功能完成。
到目前為止功能已經完成了,但我在測試時點了DataGridView的排序,上面功能就失效了,所以我將再利用CellClick來啟/停排序功能
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (this.dataGridView1.IsCurrentCellInEditMode)
{
//禁止排序
for (int i = 0; i < this.dataGridView1.Columns.Count; i++)
{
this.dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
}
}
else
{
//啟用排序
for (int i = 0; i < this.dataGridView1.Columns.Count; i++)
{
this.dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.Automatic;
}
}
}
範例下載:DataGridView_CellFocus.zip
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET