DataGridView中的單元格,無法通過KeyPress()控制,可能我沒找到方法。
通過CellValidating()在用戶結束編輯時判斷,如果不合法則還原數據。

private
void dataGridView1_CellValidating(
object sender, DataGridViewCellValidatingEventArgs e)
{
// 可編輯的列
if (e.ColumnIndex != 2 && e.ColumnIndex != 3)
return;
double outDb = 0;
if ( double.TryParse(e.FormattedValue.ToString(), out outDb))
{
e.Cancel = false;
}
else
{
e.Cancel = true; // 數據格式不正確則還原
dataGridView1.CancelEdit();
}
}
{
// 可編輯的列
if (e.ColumnIndex != 2 && e.ColumnIndex != 3)
return;
double outDb = 0;
if ( double.TryParse(e.FormattedValue.ToString(), out outDb))
{
e.Cancel = false;
}
else
{
e.Cancel = true; // 數據格式不正確則還原
dataGridView1.CancelEdit();
}
}
private
void txtK_KeyPress(
object sender, KeyPressEventArgs e)
{
double outDb = 0;
if ( double.TryParse(txtK.Text + e.KeyChar.ToString(), out outDb))
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
{
double outDb = 0;
if ( double.TryParse(txtK.Text + e.KeyChar.ToString(), out outDb))
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
url: http://greatverve.cnblogs.com/archive/2012/06/14/DataGridView-CellValidating.html
定義單元格驗證
要求:
驗證錯誤后焦點不離開。
實現:
單元格的驗證可以使用dgv_details_CellValidating事件。
驗證不通過時調用e.Cancel = true;終止事件鏈,單元格將保持編輯狀態。
調用dgv_details.CancelEdit();可以使單元格的內容會滾到修改前的值。
使用System.Windows.Forms.SendKeys.Send("^a");將全選單元格的內容。
單元格選中並開始編輯狀態
實現:
//DataGridView獲得焦點
dgv_details.Focus();
//DataGridView指定當前單元格
dgv_details.CurrentCell = dgv_details[0, 0];
//開始編輯狀態
dgv_details.BeginEdit(false);
定制自動生成綁定了列
實現:
dgv_details.AutoGenerateColumns = false;
設置列的背景色
實現:
Color GridReadOnlyColor = Color.LightGoldenrodYellow;
dgv_details.Columns[1].DefaultCellStyle.BackColor =
WinKeys.GridReadOnlyColor;
DataGridView單元格驗證的設計的問題
問題一:綁定還是不綁定?
綁定的優勢:比較簡單,代碼少。
綁定得缺點:DataGridView中的數據受數據源的影響(主鍵約束、值類型約束)。不一至時會激發DataError事件,輸入的內容無法保存到單元格中和數據源中。特殊的驗證(比如長度、格式等)還是需要另外寫代碼實現。
關於增加行的問題。增加新行時多主鍵的驗證有問題,而且驗證不通過時會將新行全部刪除。限制很多,很不方便。
非綁定的優勢:驗證等處理比較靈活。不受數據源的約束。
非綁定得缺點:顯示和向數據庫更新數據時需要比較多的代碼實現,效率比較低。
總的感覺在處理驗證比較麻煩的場合,我還是比較喜歡非綁定的方式。如果數據量大,驗證比較簡單的場合使用綁定模式比較好
要求:
驗證錯誤后焦點不離開。
實現:
單元格的驗證可以使用dgv_details_CellValidating事件。
驗證不通過時調用e.Cancel = true;終止事件鏈,單元格將保持編輯狀態。
調用dgv_details.CancelEdit();可以使單元格的內容會滾到修改前的值。
使用System.Windows.Forms.SendKeys.Send("^a");將全選單元格的內容。
單元格選中並開始編輯狀態
實現:
//DataGridView獲得焦點
dgv_details.Focus();
//DataGridView指定當前單元格
dgv_details.CurrentCell = dgv_details[0, 0];
//開始編輯狀態
dgv_details.BeginEdit(false);
定制自動生成綁定了列
實現:
dgv_details.AutoGenerateColumns = false;
設置列的背景色
實現:
Color GridReadOnlyColor = Color.LightGoldenrodYellow;
dgv_details.Columns[1].DefaultCellStyle.BackColor =
WinKeys.GridReadOnlyColor;
DataGridView單元格驗證的設計的問題
問題一:綁定還是不綁定?
綁定的優勢:比較簡單,代碼少。
綁定得缺點:DataGridView中的數據受數據源的影響(主鍵約束、值類型約束)。不一至時會激發DataError事件,輸入的內容無法保存到單元格中和數據源中。特殊的驗證(比如長度、格式等)還是需要另外寫代碼實現。
關於增加行的問題。增加新行時多主鍵的驗證有問題,而且驗證不通過時會將新行全部刪除。限制很多,很不方便。
非綁定的優勢:驗證等處理比較靈活。不受數據源的約束。
非綁定得缺點:顯示和向數據庫更新數據時需要比較多的代碼實現,效率比較低。
總的感覺在處理驗證比較麻煩的場合,我還是比較喜歡非綁定的方式。如果數據量大,驗證比較簡單的場合使用綁定模式比較好