DataRow的RemoveAt和delete

1.上次面试问到DataTable在多线程下的操作。现在想想用lock吧。

【lock(objectA){codeB} 看似简单,实际上有三个意思,这对于适当地使用它至关重要:
1. objectA被lock了吗?没有则由我来lock,否则一直等待,直至objectA被释放。
2. lock以后在执行codeB的期间其他线程不能调用codeB,也不能使用objectA。
3. 执行完codeB之后释放objectA,并且codeB可以被其他线程访问。】--摘抄

没理解好lock和单例模式,一直很晕,现在有点明白了。

private DataTable dt = new DataTable();
        private void button2_Click(object sender, EventArgs e)
        {
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));

            for (int i = 0; i < 10;i++ )
            {
                Thread thread = new Thread(AddRow);
                thread.Start();
            }
            Thread.Sleep(1000);
            dataGridView1.DataSource = dt;
        }

        private void AddRow()
        {
            lock (this)
            {
                for (int i = 0; i < 6; i++)
                {
                    DataRow dr = dt.NewRow();
                    dr["ID"] = i + 1;
                    dr["Name"] = "Item" + (i + 1);
                    dt.Rows.Add(dr);
                }
                Thread.Sleep(50);
                dt.AcceptChanges();
            }
        }
View Code

2.不过在这边看资料也看到DataRow的AcceptChanges和RejectChanges。以前一直不用这个,其实这个还是蛮重要的。

如果dt.Rows[0].delete();的话,其实只是把第一行的rowstate改成delete,并没有物理删除。

所以如果用RejectChanges的话,delete仍然会存在。

3.分析一下RemoveAt和delete的区别,还是要仔细啊:RemoveAt是DataRowCollection集合下的方法,delete是Datarow对象下的方法。

private void button1_Click(object sender, EventArgs e)
        {
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            for (int i = 0; i < 6; i++)
            {
                DataRow dr = dt.NewRow();
                dr["ID"] = i + 1;
                dr["Name"] = "Item" + (i + 1);
                dt.Rows.Add(dr);
            }
            dt.AcceptChanges();
            dt.Rows[0].Delete();
            //dt.AcceptChanges();
            dt.Rows.RemoveAt(1);
            dt.Rows.RemoveAt(2);
            dt.RejectChanges();
            dataGridView1.DataSource = dt;
        }
View Code

结果余下:1,3,5,6行。

  分析:removeAt(1)删掉第二行,这时候结果是1,3,4,5,6。

      removeAt(2)删除第三行,这时候结果是1,3,5,6。

   private void button1_Click(object sender, EventArgs e)
        {
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            for (int i = 0; i < 6; i++)
            {
                DataRow dr = dt.NewRow();
                dr["ID"] = i + 1;
                dr["Name"] = "Item" + (i + 1);
                dt.Rows.Add(dr);
            }
            dt.AcceptChanges();
            dt.Rows[0].Delete();
            dt.AcceptChanges();
            dt.Rows.RemoveAt(1);
            dt.Rows.RemoveAt(2);
            dt.RejectChanges();
            dataGridView1.DataSource = dt;
        }

结果余下:

  分析:第二个AcceptChanges(),结果是2,3,4,5,6;

      RemoveAt(1),删掉第二行,结果是2,4,5,6;

      RemoveAt(2),删除第三行,结果是2,4,6。

posted @ 2015-04-24 17:53  江境纣州  阅读(268)  评论(0编辑  收藏  举报