日期:2014-05-18  浏览次数:20799 次

winform上。一个功能。因为查询和更新大量数据,导致执行这个功能会卡一下
代码大概就是
先从数据库中读出大量数据。然后更改其中一项。在插入数据库。绑定treeview。怎么使这个不卡。。怎么优化代码
C# code

 private void 复制厂站ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //treeView1.SuspendLayout();
            Device _device = new Device();//这个是数据库的表的类
            TreeNode tn = new TreeNode();
            tn.Text = GetString("厂站名称");//这个就是赋值
            tn.Tag = "FactoryName";
            _factory.FactoryName = tn.Text;
            _factory.SetFactory();
            DataTable ds = _device.SelectAllNote(treeView1.SelectedNode.Text);//这个是查询数据库并读出大量数据
            if(ds .Rows.Count !=0)
            {

                [color=#FF0000]//下面是把数据逐行插入数据库[/color]
                for (int n = 0; n < ds .Rows .Count ; n++)
                {
                    _device.LockMainType =Convert.ToString(ds.Rows[n][8].ToString());
                    _device.VoltageGrade = Convert.ToString(ds.Rows[n][3].ToString());


                    _device.Code = Convert.ToString(ds.Rows[n][1].ToString());
                    _device.Name = Convert.ToString(ds.Rows[n][2].ToString());

                    //VoltageGrade = Convert.ToString(ds.Tables["s"].Rows[0][3].ToString());

                    _device.Room = Convert.ToString(ds.Rows[n][4].ToString()) ;

                    _device.MasterDevice = Convert.ToString(ds.Rows[n][5].ToString());
                    _device.Region = Convert.ToString(ds.Rows[n][6].ToString());
                    _device.RelatedLock = Convert.ToString(ds.Rows[n][7].ToString());
                    //LockMainType = Convert.ToString(ds.Rows[0][8].ToString());
                    _device.Lock = Convert.ToString(ds.Rows[n][9].ToString());
                    _device.LockType = Convert.ToString(ds.Rows[n][10].ToString());
                    _device.DeviceSort = Convert.ToString(ds.Rows[n][11].ToString());
                    _device.DeviceType = Convert.ToString(ds.Rows[n][12].ToString());
                    _device.Transmit = Convert.ToString(ds.Rows[n][13].ToString());
                    _device.PointNo = Convert.ToString(ds.Rows[n][14].ToString());
                    _device.DisplayNo = Convert.ToString(ds.Rows[n][15].ToString());
                    _device.MultiPosition = Convert.ToString(ds.Rows[n][16].ToString());
                    _device.InitStatus = Convert.ToString(ds.Rows[n][17].ToString());
                    _device.Position = Convert.ToString(ds.Rows[n][18].ToString());

                    _device.Note = tn.Text;
                    _device.SetDeviceCopy();//这个调用数据插入的方法
                }
            }
            _factoryName = tn.Text;
            GetNodeT(tn);
            treeView1.Nodes.Add(tn);
            treeView1.ResumeLayout();
        }


       

    }


求高手指点。。怎么做才能使这个功能不显卡

------解决方案--------------------
放到线程中去
------解决方案--------------------
可以做分页吗
------解决方案--------------------
1.展开节点的时候,只加载该节点下一级的子节点,这样可以提高显示速度
2.批量更新数据库肯定没必要,每个节点属性变化了,就用事件实时的去更新数据库,不用遍历所有节点,这样就不卡了
------解决方案--------------------
更改哪个数据库中的项,先只取这项,刚改插入完成后再取出数据,放入treeview中
------解决方案--------------------
审错题了不好意思。动态加载节点。选中某个节点时只加载该节点下的数据。
------解决方案--------------------
如果觉得慢就使用委托
this.Invoke(new Action(() => { /*原代码不动放进来*/}));
这是同步委托,当然也可以改为异步