zoukankan      html  css  js  c++  java
  • C# DataGridView中DataGridViewComboBoxCell列,下拉框事件的处理【完美解决】

    http://blog.csdn.net/a312100321/article/details/25195311

    问题:DataGridView绑定数据源之后,有一列需要用下拉框DataGridViewComboBoxCell显示,但是在处理DataGridViewComboBoxCell的下拉事件有些麻烦,它不像ComBox有SelectedIndexChanged,困扰我很久,结合网上的一些方法,再加上自己的一些改动,终于完全可以解决这个问题了。下面是我的代码,有详细注释。

    一、

            /// <summary>
            /// 首先给这个DataGridView加上EditingControlShowing事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>

    public void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                DataGridView dgv = sender as DataGridView;

                //判断相应的列
                if (dgv.CurrentCell.GetType().Name == "DataGridViewComboBoxCell" && dgv.CurrentCell.RowIndex != -1)
                {

                    //给这个DataGridViewComboBoxCell加上下拉事件
                    (e.Control as ComboBox).SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged);
                   
                }
            }

    二、

    /// <summary>
            /// 组合框事件处理
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            public void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
            {

                ComboBox combox=sender as ComboBox;

                //这里比较重要
                combox.Leave+=new EventHandler(combox_Leave);
                 try
                 {
                     //在这里就可以做值是否改变判断
                     if (combox.SelectedItem != null)
                     {
                         
                     }
                     Thread.Sleep(100);
                 }
                 catch (Exception ex)
                 {
                     MessageBox.Show(ex.Message);
                 }
            }

    三、(这一步比较重要,如果不加,会导致selectedchanged事件一直触发

    /// <summary>
            /// 离开combox时,把事件删除
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            public void combox_Leave(object sender, EventArgs e)
            {
                ComboBox combox = sender as ComboBox;
                //做完处理,须撤销动态事件
                combox.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
            }

    总结:网上的方法一般都是在第二步的时候把

    //做完处理,须撤销动态事件
                combox.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);

    这个事件撤销了,但是我在用的时候,发现,如果在第二步就撤销这个事件,在Combox没有失去焦点的情况下,选择另一个选项,不会触发Combox的selectedchanged事件

  • 相关阅读:
    【xsy1230】 树(tree) 点分治+线段树
    【xsy1237】 字符转换 矩阵快速幂
    【xsy1232】Magic 最小割
    【xsy1144】选物品 主席树
    【xsy3423】党² 线段树+李超线段树or动态半平面交
    $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
    $Django redis内存数据库 (知识回顾cmd切换目录)
    $Django 路飞之课程下的分类,用户登陆成功前端存cookie,
    $Django 路飞之小知识回顾,Vue之样式element-ui,Vue绑定图片--mounted页面挂载--路由携带参数
    $Django 路飞学城项目简介
  • 原文地址:https://www.cnblogs.com/LuoEast/p/7827574.html
Copyright © 2011-2022 走看看