zoukankan      html  css  js  c++  java
  • DataGridView的Validating事件注册后删除操作的处理

    我们在处理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,而且适用性也不是很广。需要设置的也很多,

    删除按钮必须关联到datagridView,而且删除事件也是卸载datagridView控件中的。



  • 相关阅读:
    WPF 关于多语言 的实现 学习,利用反射中的特性
    WPF Textbox 中文输入崩溃 规避
    自定义控件.依赖项属性同步更新内部控件属性
    HexInput
    HashMap实现原理分析
    centos下nginx安装
    dos下mybatis自动生成代码
    设计模式之装饰器模式
    Java 中的悲观锁和乐观锁的实现
    redis分布式锁
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3323014.html
Copyright © 2011-2022 走看看