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

线程 刷新listview 问题
刷新不了数据求指点。。。
C# code


 public delegate void listSet(ListViewItem s);
        private void SetItem(ListViewItem s)
        {
            if (this.listView1.InvokeRequired)
            {
                listSet setitme = new listSet(SetItem);
                this.BeginInvoke(setitme,new object[]{s});
                return;
            }
            else
            {
             
               listView1.Items.Add(s);
            }
        }
        private void ThreadProc()
        {
            listView1.Items.Clear();
            string sql = " select tw.*,b.gprs_number from dbo.Temp_WaterState as tw join basis_use_water_origin_rtu as b on  tw.T_ClientID=b.clientid";
            DataSet dt = DHelper.GetDataSet(sql);
            int cot = dt.Tables[0].Rows.Count;
            for (int i = 0; i < cot; i++)
            {
                ListViewItem list = new ListViewItem();
                list.SubItems.Clear();
                list.Text = dt.Tables[0].Rows[i]["T_ClientID"] + "";
                list.Tag = dt.Tables[0].Rows[i]["T_ClientID"] + "";       
                list.SubItems.Add(DHelper.getName(dt.Tables[0].Rows[i]["T_ClientID"] + ""));
                list.SubItems.Add(dt.Tables[0].Rows[i]["T_Time"] + "");
                list.SubItems.Add(dt.Tables[0].Rows[i]["gprs_number"] + "");
                list.SubItems.Add(DHelper.getKZQ(Convert.ToInt32(dt.Tables[0].Rows[i]["T_EquipState"])));
                list.SubItems.Add(DHelper.getWL(Convert.ToInt32(dt.Tables[0].Rows[i]["T_GPRSState"])));
                list.SubItems.Add(DHelper.getGD(Convert.ToInt32(dt.Tables[0].Rows[i]["T_PowerSupply"])));
                list.SubItems.Add(DHelper.getM(Convert.ToInt32(dt.Tables[0].Rows[i]["T_OpenAlarm"])));
              
                SetItem(list);
                
                Thread.Sleep(500);

            }
            Thread.Sleep(5000);
      
        }
        private void go_Click(object sender, EventArgs e)
        {
            Thread th1 = new Thread(new ThreadStart(ThreadProc));
            th1.Start();
        }




------解决方案--------------------
需要切换线程
ThreadProc 里面用 BeginInvoke  切换到 SetItem 函数, 所有对 ListView的操作都需要在 SetItem中完成
------解决方案--------------------
怎么个刷新不了数据?是结束的时候一次性显示,还是根本不显示更新后的数据?
另外你的“listView1.Items.Clear();”没放到外面调用,获取数据还分好几次访问数据库,效率实在太低。
------解决方案--------------------
线程访问控件要用委托
------解决方案--------------------
探讨

线程访问控件要用委托