[C#.NET][Winform][ADO.NET] 限制 DataGridView 輸入字元

[ADO.NET][WinForm] 限制 DataGridView 輸入字元

最近在工作上常使用DataGridView操作,未來將這些操作整理起來,以便以後參考使用,限制字元在UI應用上相當的普遍,有時我們要限制使用者只能輸入數字,這時我們需要用到ASCII,這時有兩種方法,一種是使用查表法,上網找就一堆資料了;另一種則是使用 Encoding.ASCII 屬性,本篇將使用查表法的方式來取得字元的ACSII  Code。

接下來我們來實作吧,首先當然要有DataGridView控制項,再來加入編輯儲存格事件 EditingControlShowing

image

再來資料繫結一下


private void Form1_Load(object sender, EventArgs e)
{
    DataTable table = new DataTable();
    string[] fields = new string[] {"ID","Name","Phone" };
    foreach (var item in fields)
    {
        DataColumn column = new DataColumn();
        column.Caption = item;
        column.ColumnName = item;
        table.Columns.Add(column);
    }
    DataRow row = table.NewRow() ;
    row["ID"] = "1";
    row["Name"] = "余小章";
    row["Phone"] = "0806449";
    table.Rows.Add(row);
    dataGridView1.DataSource = table;
}


我們來觀察一下當在編輯DataGridView時的事件

image

被我看到TextBox了,真high!

然後我們就把 DataGridViewEditingControlShowingEventArgs 轉型成 TextBox,並註冊KeyPress事件

 

 


private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    TextBox tb = (TextBox)e.Control;
    tb.KeyPress += new KeyPressEventHandler(tb_KeyPress);
} 

void tb_KeyPress(object sender, KeyPressEventArgs e)
{
    char key = e.KeyChar;
    int value = (int)key;
    if ((value >= 48 && value <= 57) || value == 46 || value == 8 || value == 43 || value == 45)
        e.Handled = false;
    else
        e.Handled = true;
}

 

如此一來我們便可限制DataGridView可輸入的字元了!

PS,至於上面的value是代表什麼意思就得查表了。

儲存格編輯完成後再使用CellEndEdit事件來檢查輸入的項目是否符合規則,若不符合規則可以使用 DataGridViewCell.ErrorText 來提醒使用者


private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    DataGridView view = (DataGridView)sender;
    if (e.RowIndex == view.RowCount - 1)
        return;
    //Debug.WriteLine(e.ToString());
    string value = "";
    float data = 0;
    switch (e.ColumnIndex)
    {
        case 0:
            value = view.CurrentCell.Value.ToString();
            if (value == "")
            {
                view.CurrentCell.ErrorText = "不能為空";
                break;
            }
            break;
     } 
}

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo