奇怪的编译错误“线程间操作无效: 从不是创建控件“listView1”的线程访问它”

k2274194 2009-06-09 04:25:36
各位大侠们 小弟又遇到问题了!不知道这是什么原因希望大家能帮忙下 我用的编程工具是VS2008和SQL2005,在编译时候出现:“线程间操作无效: 从不是创建控件“listView1”的线程访问它。”而且是指向:“this.listView1.Items.Clear();”这行 以下是代码。先谢谢了!
private void f5(object source, System.Timers.ElapsedEventArgs e)
{

this.listView1.Items.Clear();

SqlOperations sqlop = new SqlOperations();
DataSet ds = new DataSet();
try
{
int n;
int o;


string readmmoney = "select mmoney from VIP where muse = 1";

ds = sqlop.ReadDataBySql(readmmoney);

string mmoney = ds.Tables[0].Rows[0][0].ToString();
int m = ds.Tables[0].Rows.Count;
int[] vmoney = new int[m];
for (o = 0; o < ds.Tables[0].Rows.Count; o++)
{
vmoney[o] = Convert.ToInt32(ds.Tables[0].Rows[o][0].ToString());
}

string readminfo = "select * from VIPuse";
ds = sqlop.ReadDataBySql(readminfo);
if (ds.Tables[0].Rows.Count == 0)
{
//MessageBox.Show("现在还没有会员刷卡上机!", "温馨提示:", MessageBoxButtons.OK);我该 得
return;
}
else
{
for (n = 0; n < ds.Tables[0].Rows.Count; n++)
{
DateTime time1 = Convert.ToDateTime(ds.Tables[0].Rows[n][4].ToString());
DateTime time2 = Convert.ToDateTime(DateTime.Now.ToString());
string datediff = DateDiff(time1, time2);
// string time = Convert.ToString(dateDiff);
ListViewItem li = new ListViewItem();

li.SubItems.Clear();
li.SubItems[0].Text = ds.Tables[0].Rows[n][1].ToString();
li.SubItems.Add(ds.Tables[0].Rows[n][2].ToString());
li.SubItems.Add(ds.Tables[0].Rows[n][3].ToString());
li.SubItems.Add(datediff.ToString());
li.SubItems.Add(ds.Tables[0].Rows[n][5].ToString());
li.SubItems.Add(vmoney[n].ToString());
li.SubItems.Add(ds.Tables[0].Rows[n][6].ToString());
li.SubItems.Add("正常使用");
this.listView1.Items.Add(li);
//this.listView1.Items[a++].ImageIndex = 13;
}

}

}
catch (Exception)
{
//MessageBox.Show("现在还没有会员刷卡上机!", "温馨提示:", MessageBoxButtons.OK);我该 得
return;
}
}
...全文
387 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
k2274194 2009-06-09
  • 打赏
  • 举报
回复
谢谢你们!特别谢谢4楼的benjerry,按他的方法解决了!
benjerry 2009-06-09
  • 打赏
  • 举报
回复
在函数开头加上
CheckForIllegalCrossThreadCalls = false;
就行了
wjq 2009-06-09
  • 打赏
  • 举报
回复
既然是WinForm,那么用工具栏里的那个Timer(System.Windows.Forms.Timer)而不要用System.Timers.Timer
2者是有区别,
前者,基于Windows系统消息,用WinAPI setTimer/killTimer向窗体发送消息或者用自己的回调函数实现的,他运行在主线程内。
后者,主要用于没有窗体界面的场合,如Windows Service,他是通过多线程实现的。他运行在一个自进程上,所以通过他访问界面元素会导致该情况。就如同多线程更新界面元素时的情况。

总之,改用System.Windows.Forms.Timer是最快的解决办法
Profiteerchen 2009-06-09
  • 打赏
  • 举报
回复
因为你的this.listView1是在主线程中创建的,在.NET下需要通过invoke调用不同线程间的控件
feiyun0112 2009-06-09
  • 打赏
  • 举报
回复
this.CheckForIllegalCrossThreadCalls =false;

*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)

http://feiyun0112.cnblogs.com/

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧