DataGridView数据验证CellValidating()
生活随笔
收集整理的這篇文章主要介紹了
DataGridView数据验证CellValidating()
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
如果是TextBox可以通過KeyPress()事件,讓用戶無法輸入非法數(shù)據(jù)。
DataGridView中的單元格,無法通過KeyPress()控制,可能我沒找到方法。
通過CellValidating()在用戶結(jié)束編輯時判斷,如果不合法則還原數(shù)據(jù)。
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;//數(shù)據(jù)格式不正確則還原
????????dataGridView1.CancelEdit();
????}
}TextBox的KeyPress()事件
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;
????}
}我繼承TextBox重寫KeyPress()封裝了個自定義控件。
url:http://greatverve.cnblogs.com/archive/2012/06/14/DataGridView-CellValidating.html
定義單元格驗(yàn)證
要求:
驗(yàn)證錯誤后焦點(diǎn)不離開。
實(shí)現(xiàn):
單元格的驗(yàn)證可以使用dgv_details_CellValidating事件。
驗(yàn)證不通過時調(diào)用e.Cancel = true;終止事件鏈,單元格將保持編輯狀態(tài)。
調(diào)用dgv_details.CancelEdit();可以使單元格的內(nèi)容會滾到修改前的值。
使用System.Windows.Forms.SendKeys.Send("^a");將全選單元格的內(nèi)容。
?
單元格選中并開始編輯狀態(tài)
實(shí)現(xiàn):
//DataGridView獲得焦點(diǎn)
dgv_details.Focus();
//DataGridView指定當(dāng)前單元格
dgv_details.CurrentCell = dgv_details[0, 0];
//開始編輯狀態(tài)
dgv_details.BeginEdit(false);
?
定制自動生成綁定了列
實(shí)現(xiàn):
dgv_details.AutoGenerateColumns = false;
?
設(shè)置列的背景色
實(shí)現(xiàn):
Color GridReadOnlyColor = Color.LightGoldenrodYellow;
dgv_details.Columns[1].DefaultCellStyle.BackColor =
WinKeys.GridReadOnlyColor;
?
DataGridView單元格驗(yàn)證的設(shè)計(jì)的問題
問題一:綁定還是不綁定?
綁定的優(yōu)勢:比較簡單,代碼少。
綁定得缺點(diǎn):DataGridView中的數(shù)據(jù)受數(shù)據(jù)源的影響(主鍵約束、值類型約束)。不一至?xí)r會激發(fā)DataError事件,輸入的內(nèi)容無法保存到單元格中和數(shù)據(jù)源中。特殊的驗(yàn)證(比如長度、格式等)還是需要另外寫代碼實(shí)現(xiàn)。
關(guān)于增加行的問題。增加新行時多主鍵的驗(yàn)證有問題,而且驗(yàn)證不通過時會將新行全部刪除。限制很多,很不方便。
?
非綁定的優(yōu)勢:驗(yàn)證等處理比較靈活。不受數(shù)據(jù)源的約束。
非綁定得缺點(diǎn):顯示和向數(shù)據(jù)庫更新數(shù)據(jù)時需要比較多的代碼實(shí)現(xiàn),效率比較低。
?
總的感覺在處理驗(yàn)證比較麻煩的場合,我還是比較喜歡非綁定的方式。如果數(shù)據(jù)量大,驗(yàn)證比較簡單的場合使用綁定模式比較好?
DataGridView中的單元格,無法通過KeyPress()控制,可能我沒找到方法。
通過CellValidating()在用戶結(jié)束編輯時判斷,如果不合法則還原數(shù)據(jù)。
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;//數(shù)據(jù)格式不正確則還原
????????dataGridView1.CancelEdit();
????}
}TextBox的KeyPress()事件
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;
????}
}我繼承TextBox重寫KeyPress()封裝了個自定義控件。
url:http://greatverve.cnblogs.com/archive/2012/06/14/DataGridView-CellValidating.html
定義單元格驗(yàn)證
要求:
驗(yàn)證錯誤后焦點(diǎn)不離開。
實(shí)現(xiàn):
單元格的驗(yàn)證可以使用dgv_details_CellValidating事件。
驗(yàn)證不通過時調(diào)用e.Cancel = true;終止事件鏈,單元格將保持編輯狀態(tài)。
調(diào)用dgv_details.CancelEdit();可以使單元格的內(nèi)容會滾到修改前的值。
使用System.Windows.Forms.SendKeys.Send("^a");將全選單元格的內(nèi)容。
?
單元格選中并開始編輯狀態(tài)
實(shí)現(xiàn):
//DataGridView獲得焦點(diǎn)
dgv_details.Focus();
//DataGridView指定當(dāng)前單元格
dgv_details.CurrentCell = dgv_details[0, 0];
//開始編輯狀態(tài)
dgv_details.BeginEdit(false);
?
定制自動生成綁定了列
實(shí)現(xiàn):
dgv_details.AutoGenerateColumns = false;
?
設(shè)置列的背景色
實(shí)現(xiàn):
Color GridReadOnlyColor = Color.LightGoldenrodYellow;
dgv_details.Columns[1].DefaultCellStyle.BackColor =
WinKeys.GridReadOnlyColor;
?
DataGridView單元格驗(yàn)證的設(shè)計(jì)的問題
問題一:綁定還是不綁定?
綁定的優(yōu)勢:比較簡單,代碼少。
綁定得缺點(diǎn):DataGridView中的數(shù)據(jù)受數(shù)據(jù)源的影響(主鍵約束、值類型約束)。不一至?xí)r會激發(fā)DataError事件,輸入的內(nèi)容無法保存到單元格中和數(shù)據(jù)源中。特殊的驗(yàn)證(比如長度、格式等)還是需要另外寫代碼實(shí)現(xiàn)。
關(guān)于增加行的問題。增加新行時多主鍵的驗(yàn)證有問題,而且驗(yàn)證不通過時會將新行全部刪除。限制很多,很不方便。
?
非綁定的優(yōu)勢:驗(yàn)證等處理比較靈活。不受數(shù)據(jù)源的約束。
非綁定得缺點(diǎn):顯示和向數(shù)據(jù)庫更新數(shù)據(jù)時需要比較多的代碼實(shí)現(xiàn),效率比較低。
?
總的感覺在處理驗(yàn)證比較麻煩的場合,我還是比較喜歡非綁定的方式。如果數(shù)據(jù)量大,驗(yàn)證比較簡單的場合使用綁定模式比較好?
轉(zhuǎn)載于:https://www.cnblogs.com/greatverve/archive/2012/06/14/DataGridView-CellValidating.html
總結(jié)
以上是生活随笔為你收集整理的DataGridView数据验证CellValidating()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PostgreSQL 8.3 以上的中文
- 下一篇: 大数据处理系列之(一)Java线程池使用