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(); } }
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; }
结果余下: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。