winform datagridview 多个单元格验证,验证不通过焦点不能移开,验证通过焦点自动进入下个单元格。

一叶无秋 2019-05-23 11:02:33
winform datagridview 多个单元格验证,验证不通过焦点不能移开,验证通过焦点自动进入下个单元格。只有整行通过验证后才能保存数据库,若整行数据校验没有通过,焦点不能点击其它行。
 private void dgv_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (e.ColumnIndex == 0) return;
DataGridViewRow dataGVrow = this.dgv.Rows[e.RowIndex];
string oneProjectName = string.Empty;
string twoProjectName = string.Empty;
if (this.dgvProjectNameSettingLevelTwo.BeginEdit(true))
{
oneProjectName = dataGVrow.Cells["一级名称"].EditedFormattedValue.ToString();
twoProjectName = dataGVrow.Cells["二级名称"].EditedFormattedValue.ToString();
}
else
{
oneProjectName = dataGVrow.Cells["一级名称"].Value.ToString();
twoProjectName = dataGVrow.Cells["二级名称"].Value.ToString();
}
DataRow dr = (dataGVrow.DataBoundItem as DataRowView).Row;
e.Cancel = false;
if (e.ColumnIndex == 2)
{
if (string.IsNullOrEmpty(oneProjectName))
{
MessageBox.Show("一级名称为空。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Hand);
e.Cancel = true;
this.dgv.CurrentCell = dataGVrow.Cells["一级名称"];
this.dgv.BeginEdit(true);
if (this.dgvProjectNameSettingLevelTwo.EditingControl is TextBox)
((TextBox)dgvProjectNameSettingLevelTwo.EditingControl).SelectAll();
return;
}


}
if (e.ColumnIndex == 3)
{
if (string.IsNullOrEmpty(twoProjectName))
{
MessageBox.Show("二级名称为空。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Hand);
e.Cancel = true;
this.dgv.CurrentCell = dataGVrow.Cells["二级工程名称"];
this.dgv.BeginEdit(true);
if (this.dgvProjectNameSettingLevelTwo.EditingControl is TextBox)
((TextBox)dgvProjectNameSettingLevelTwo.EditingControl).SelectAll();
return;
}
}
}

一级单元填写完成后,进入CellEndEdit 事件,在CellEndEdit事件再次校验整行数据,通过保存,CellEndEdit 那个单元格数据没有填写,鼠标聚焦到该单元,但是却出发了CellValidating事件,这样 形成了事件触发死循环。
...全文
150 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
一叶无秋 2019-05-24
  • 打赏
  • 举报
回复
 private void dgv_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            if (e.ColumnIndex != 2 && e.ColumnIndex != 3)
                return;
            DataGridViewRow dataGVrow = this.dgv.Rows[e.RowIndex];
            string oneProjectName = string.IsNullOrEmpty(dataGVrow.Cells["一级名称"].EditedFormattedValue.ToString()) != true ? dataGVrow.Cells["一级名称"].EditedFormattedValue.ToString() : dataGVrow.Cells["一级名称"].Value.ToString();
            string twoProjectName = string.IsNullOrEmpty(dataGVrow.Cells["二级名称"].EditedFormattedValue.ToString()) != true ? dataGVrow.Cells["二级名称"].EditedFormattedValue.ToString() : dataGVrow.Cells["二级名称"].Value.ToString();
            DataRow dr = (dataGVrow.DataBoundItem as DataRowView).Row;
            if (string.IsNullOrEmpty(oneProjectName))
            {
                MessageBox.Show("一级名称为空。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                e.Cancel = true;
                this.dgv.CurrentCell = dataGVrow.Cells["一级名称"];
                this.dgv.BeginEdit(true);
                if (this.dgv.EditingControl is TextBox)
                    ((TextBox)dgv.EditingControl).SelectAll();
                return;
            }
            if (string.IsNullOrEmpty(twoProjectName))
            {
                MessageBox.Show("二级名称为空。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                e.Cancel = true;
                this.dgv.CurrentCell = dataGVrow.Cells["二级名称"];
                this.dgv.BeginEdit(true);
                if (this.dgv.EditingControl is TextBox)
                    ((TextBox)dgv.EditingControl).SelectAll();
                return;
            }

     
            }
        }
使用RowValidating 事件,切换行的时候再次验证,像单行多个单元格验证,要控制好 this.dgv.BeginEdit(true)控制, BeginEdit控制不好 会触发CellValidating事件的死循环。
wilson1966 2019-05-23
  • 打赏
  • 举报
回复
这个无解,只能退而求其次,当输入错误只显示错误讯息,Focus可离开CELL ,但CELL 里的资料要清空

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧