[C#.NET][Winform][ADO.NET] 依條件設定 DataGridView.CurrentCell 焦點

[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

Image result for microsoft+mvp+logo