我们在处理DataGridView必填项判断时,一般使用DataGridView的RowValidating事件判断,具体代码如下:
protected override void OnRowValidating(DataGridViewCellCancelEventArgs e) { base.OnRowValidating(e); if (NecessaryColIndexArray != null) { for (int i = 0; i < Rows.Count; i++) { if (Rows[i].IsNewRow) continue; //this.delete for (int m = 0; m < NecessaryColIndexArray.Length; m++) { //判D断?行D数ºy是º?否¤?超?出?集¡¥合? if (NecessaryColIndexArray[m] >= 0 && NecessaryColIndexArray[m] < Columns.Count - 1) { if (Rows[i].Cells[NecessaryColIndexArray[m]].Value==null || string.IsNullOrEmpty(Rows[i].Cells[NecessaryColIndexArray[m]].Value.ToString())) { Messagetools.ShowMsg("列¢D"+Columns[NecessaryColIndexArray[m]].HeaderText+"是º?否¤?删¦?除y第̨² ¬?项?,ê?必À?须?填¬?写¡ä内¨²容¨Y。¡ê"); e.Cancel = true; } } } } } }其中:NecessaryColIndexArray为Int[]型属性,卸载自定义DataGridView控件中。
表示必填项列的索引。
这样我们就可以实现必填项判断了。
但是这里还有一个问题:
当我们处理删除事件时,尤其是我们删除必填项没有填写完全的行的问题时。
这个Validating会一直触发。而无法完成目标。这是因为我们点击删除按钮时,
DataGridview失去焦点而删除按钮获得焦点,这样会引发Validating事件。
所以解决方法如下:
在datagridView中添加一个判断条件bool isDeleting = false;
并且将本datagridView的删除按钮作为一个属性添加到我们的自定义datagridView控件中。
这样我们在datagridview控件的LostFocus事件中可以判断是否删除按钮获得了焦点,
如果是删除按钮获得焦点,那么就我进行validating判断语句执行。
bool isDeleting = false; protected override void OnLostFocus(EventArgs e) { base.OnLostFocus(e); //判D断?是º?否¤?删¦?除y按ã¡ä钮£¤获?取¨?焦1点Ì?,ê?并¡é且¨°当Ì¡À时º¡À删¦?除y的Ì?时º¡À Validating有®D错䨪误¨®的Ì?行D,ê? //即¡äCurrentCell为a当Ì¡À前¡ã选?中D,ê?停ª¡ê止1Validating if (btnDel != null) isDeleting = btnDel.Focused; } protected override void OnRowValidating(DataGridViewCellCancelEventArgs e) { base.OnRowValidating(e); if (NecessaryColIndexArray != null&&!isDeleting) { for (int i = 0; i < Rows.Count; i++) { if (Rows[i].IsNewRow) continue; //this.delete for (int m = 0; m < NecessaryColIndexArray.Length; m++) { //判D断?行D数ºy是º?否¤?超?出?集¡¥合? if (NecessaryColIndexArray[m] >= 0 && NecessaryColIndexArray[m] < Columns.Count - 1) { if (Rows[i].Cells[NecessaryColIndexArray[m]].Value==null || string.IsNullOrEmpty(Rows[i].Cells[NecessaryColIndexArray[m]].Value.ToString())) { Messagetools.ShowMsg("列¢D:'"+Columns[NecessaryColIndexArray[m]].HeaderText+"'是º?必À?填¬?项?,ê?必À?须?填¬?写¡ä内¨²容¨Y。¡ê"); e.Cancel = true; } } } } } }
这么做基本满足要求。但是有一个BUG就是我选择删除按钮,但是不单击它,就会忽略validating事件。结果方法如下:
转移到 删除按钮时 在按钮tag上加判断。1为完成Click
protected override void OnLostFocus(EventArgs e) { base.OnLostFocus(e); //判D断?是º?否¤?删¦?除y按ã¡ä钮£¤获?取¨?焦1点Ì?,ê?并¡é且¨°当Ì¡À时º¡À删¦?除y的Ì?时º¡À Validating有®D错䨪误¨®的Ì?行D,ê? //即¡äCurrentCell为a当Ì¡À前¡ã选?中D,ê?停ª¡ê止1Validating if (btnDel != null) { isDeleting = btnDel.Focused; btnDel.Tag = 0; } }
点击事件
void btnDel_Click(object sender,EventArgs e) { btnDel.Tag = 1; btnDelClick(); }
删除按钮的lostfocus事件中判断
if (btnDel.Tag.ToString() != "1"&&isDeleting) { isDeleting = false; OnRowValidating(new DataGridViewCellCancelEventArgs(0,CurrentCell.RowIndex)); }这样就可以比较完美的解决此问题。但是这么解决不是从本质上解决这个问题虽然目前还没有发现什么BUG,
但是不知道是否有BUG,而且适用性也不是很广。需要设置的也很多,
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。