读书人

winform 在cellEndEdit事件 删除datag

发布时间: 2012-04-21 14:34:44 作者: rapoo

winform 在cellEndEdit事件 删除datagridview 行问题

C# code
private void dgv_Data2_CellEndEdit(object sender, DataGridViewCellEventArgs e)        {            IncellEdit = true;             try            {                ocnn = new OleDbConnection(connections);                ocnn.Open();                           for (int i = 0; i < dgv_Data2.Rows.Count - 1; i++)                {                    for (int j = 0; j < dgv_Data2.Rows.Count - 1; j++)                    {                        string value1 = Convert.ToString(dgv_Data2.Rows[i].Cells[2].Value);                        string value2 = Convert.ToString(dgv_Data2.Rows[j].Cells[2].Value);                        if (i != j && value1 == value2)                        {                            MessageBox.Show("此货物已当前列表中!", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Information);                                                        [color=#FF0000]PushDelIndex(e.RowIndex);                            Thread delTh = new Thread(new ThreadStart(delRowThread));                            delTh.Start();[/color]//                            return;                        }                        else                        {                            string sql = "select * from MIS_MaterielRegiser where MR_Name='" + value1 + "'";                            ocmd = new OleDbCommand(sql, ocnn);                            OleDbDataReader reader = ocmd.ExecuteReader();                            reader.Read();                            dgv_Data2.Rows[i].Cells[1].Value = reader["MR_Number"].ToString();                            dgv_Data2.Rows[i].Cells[3].Value = reader["MR_Model"].ToString();                            dgv_Data2.Rows[i].Cells[4].Value = reader["MR_Unit"].ToString();                        }                    }                }                ocnn.Close();            }            catch (Exception)            {                MessageBox.Show("请从货物名称中选择一项!");            }        }

具体想法如下:
如果datagridview 中第j行的指定单元格值和 i 行的相同,则删除该行。
于是在网上找了个多线程的处理方法,但是这种做法删除的是当前行,而不是出错的行。换个说法就是,我如果在j行输入一个相同值,然后把鼠标点击下面的空行(datagridview自动增加的)这个做法就错误了。更甚至点上面已输入没出错的,就把这个也删掉了 - -! 多线程我真的不怎么懂~表述可能有点复杂,求大侠指点!
C# code
private int[] delIndex = null;//待删行号的数组        private bool delFlag = true;//是否要不间断尝试删除数组中的行        private bool deling = false;//是否有线程正在执行删除操作的锁变量        private void PushDelIndex(int _index)        {            if(delIndex==null)            {                delIndex=new int[]{_index};            }            else            {                Array.Resize(ref delIndex,delIndex.Length+1);//展示如何扩充数组                delIndex[delIndex.Length - 1] = _index;            }        }        private void delRowThread()        {            while (delFlag)            {                if (delIndex != null)                {                    if (deling == false)                    {                        delRow();                    }                }                Thread.Sleep(100);            }        }        //此处展现了如何在非创建控件的线程里去修改控件的方法        private delegate void delRowCallBack();        private void delRow()        {            if (dgv_Data2.InvokeRequired)            {                deling = true;                delRowCallBack o = new delRowCallBack(delRow);                this.Invoke(o);            }            else            {                for (int i = 0; i < delIndex.Length; i++)                {                    dgv_Data2.Rows.RemoveAt(delIndex[i]);                 }            deling = false;            delIndex = null;            }        }



------解决方案--------------------


不需要多线程

C# code
void SetTimeout(MethodInvoker method, int timeout=100){    Timer t = new Timer();    t.Interval = timeout;    t.Interval += delegate{        t.Stop();        method();        t.Dispose();    };    t.Start();} 

读书人网 >C#

热点推荐