线程 刷新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();”没放到外面调用,获取数据还分好几次访问数据库,效率实在太低。
[解决办法]
线程访问控件要用委托
[解决办法]