zoukankan      html  css  js  c++  java
  • 关于DataGridViewComboBoxCell修改后提交数据源

    最近在项目遇到一个功能实现。是在DataGridView中DataGridViewComboboxColumn列绑定数据源,

    DisplayMember为数据表的Name列,ValueMember是数据表的ID列。

    需求是希望对DataGridView的ComboBoxCell进行编辑,添加新的选项并更新数据源及数据绑定。

    1.使DataGridViewComboBoxCell进入编辑状态,这个很简单。做法如下:
    注册DataGridView的EditingControlShowing事件,代码如下:

    private void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                DataGridView dgv = sender as DataGridView;
                bool isRight = 
                    dgv.CurrentCellAddress.X == ColJCFF.DisplayIndex;
                if (isRight)
                {
                    ComboBox cb = e.Control as ComboBox;
                    if (cb != null)
                    {
                        cb.DropDownStyle = ComboBoxStyle.DropDown; 
                    }
                }
            }

    2.获取输入数据,检查并实现更新数据源

    注册DataGridView的CellValidating事件,判断输入的数据是否在数据源中,

    如果不在那么提交更改,重新绑定DataGridViewComboboxColumn数据。代码如下:

    private void dgvMode_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
            {
                DataGridView dgv = sender as DataGridView;
                bool isempty = string.IsNullOrEmpty(e.FormattedValue.ToString());
                DataGridViewComboBoxColumn cmbCol = dgv.Columns[e.ColumnIndex] as DataGridViewComboBoxColumn;
                if (cmbCol == null)
                    return;
                if (!isempty)
                {
                    bool isCol = dgv.Columns[e.ColumnIndex].Name == cmbCol.Name;
                    if (isCol)
                    {
                        //现有选项中不包含输入数据
                        if (!cmbCol.Items.Contains(e.FormattedValue))
                        {
                            //获取数据源
                            DataTable dt = cmbCol.DataSource as DataTable;
                            if (dt == null)
                                return;
                            string valueStr = "";//新添加的ID
                            //判读数据源中是否包含输入数据
                            DataRow[] rows = dt.Select(cmbCol.DisplayMember + " = '" + e.FormattedValue + "'");
                            if (rows.Length == 0)//没有包含
                            {
                                string guid = GetNewID();//获取新的ID
                                dt.Rows.Add();
                                dt.Rows[dt.Rows.Count - 1][1] = e.FormattedValue.ToString();
                                dt.Rows[dt.Rows.Count - 1][0] = guid; 
                                valueStr = guid;
                                    UpDataMethod(dt);//更新数据
                                //重新绑定列数据源
                                BindColumn();
                            }
                            else//如果集合内包含此数据
                                valueStr = rows[0][0].ToString();
                            //更新DataGridView数据
                            ComboBox cmb = dgv.EditingControl as ComboBox;
                            if (cmb != null)
                                cmb.SelectedValue = valueStr;
                        }
                    }
                }
            }
    


    要注意如下代码:

    ComboBox cmb = dgv.EditingControl as ComboBox;
    if (cmb != null)
       cmb.SelectedValue = valueStr;
    


    此时更新DataGridView数据是指对DataGridView的EditControl(Combobox)的数据更新,

    如果你直接更新DataGridView的数据,例如:

    dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = valueStr;


    当前Cell的数据会发生改变,但是当EditControl(Combobox)随后提交数据时,

    因为EditControl(Combobox)的数据没有改变,那么当前Cell的数据还会改为
    EditControl(Combobox)的数据,也即当前Cell的原始数据没有改变。

    这样就会使你更新DataGridViewComboBoxColumn数据源后,DataGridView当前Cell的值不是你预期的填写的数据项。

    而我们直接更改EditControl(Combobox)的数据后,EditControl(Combobox)提交更改为你预期的填写的数据。

    所以我们要更改EditControl(Combobox)的数据而不是当前Cell的Value。


  • 相关阅读:
    【设计模式
    【设计模式
    【设计模式
    【设计模式
    【设计模式
    【设计模式
    实干猪
    Mysql 千万级快速查询|分页方案
    如何成为一名优秀的CTO(首席技术官)
    成为优秀程序员的10个有效方法
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3323031.html
Copyright © 2011-2022 走看看