PDA

View Full Version : سوال: مشکل با Datagirdview در زمان استفاده از thread



esagraphic
دوشنبه 16 شهریور 1394, 11:56 صبح
سلام به همه دوستان من تو برنامه ام زمانی که لود میشه یه سری کد های دارم که از اون جمله یکی اینه که اطلاعات دیتابیس خونده میشه به دیتا گرید ریخته میشه اونم تنها 100 عددش بعدا متوجه شدم برنامه ام برای اولین بار که لود میشه برای ده ثانیه هنگ میکنه متوجه شدم که مشکل از دیتاگرید است که اطلاعات را بایند میکنه کدش اینه



public void Form1_Load(object sender, EventArgs e)
{


fildatagridview();

timer2.Enabled = true;
openport();

outdortype = Properties.Settings.Default.outdortype;

}




بعد تو برنامه یک فنکشن دارم که اطلاعات را میخونه اینطوری



public void fildatagridview()
{
dataGridView1.RowsDefaultCellStyle.BackColor = Color.Khaki;
dataGridView1.AlternatingRowsDefaultCellStyle.Back Color = Color.LemonChiffon;
SqlConnection c = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirec tory|\haic.mdf;Integrated Security=True;Connect Timeout=30");
SqlDataAdapter a = new SqlDataAdapter(" Select id AS [ردیف] , TruckNo As[نمبر موتر] , Weightfull as [وزن پر] , WeightEmpy as [وزن خالی] , Netweight as [وزن خالص] , Goods as [نوع کالا] , Customername as [مشتری] , Barnama as [شماره بارنامه] , origin as [مبدا] , Destination as [مقصد] , Trucktype as [نام موتر], operator as [اپراتور] , datefull as [تاریخ و ساعت پر] , dateempy as [تاریخ و ساعت خالی] ,datefullmiladi as [تاریخ پر میلادی] ,weighttype as [نوع وزن گیری] , towzintype as [نوع توزین] from Weight order by id desc", c);
DataTable t = new DataTable();
a.Fill(t);
dataGridView1.DataSource = t;


}


بعد اومدم اون Filldatagirdview را توسط یک ترید صدا زدم که بقیه زود تر اجرا بشه اینجوری



public void Form1_Load(object sender, EventArgs e)
{



Thread fill = new Thread(fildatagridview);
fill.Start();
timer2.Enabled = true;
openport();

outdortype = Properties.Settings.Default.outdortype;

}


اما زمانی که ترید اجرا میشه در قسمت
a.Fill(t); این ایرور را میده
Cross-thread operation not valid: Control 'dataGridView1' accessed from a thread other than the thread it was created on.

نفهمیدم مشکلش چیه منتظر پاسخ تان هستم تشکر

zayens
دوشنبه 16 شهریور 1394, 12:03 عصر
خب برای اینکه a.Fill را باید توی DELEGATE بندازی

FastCode
دوشنبه 16 شهریور 1394, 12:05 عصر
این برای این هست که پست رو کامل نمیخونید.
توی اون تاپیک اگر دقت کنید گفتم Control.Invoke

esagraphic
دوشنبه 16 شهریور 1394, 12:05 عصر
خب برای اینکه a.Fill را باید توی DELEGATE بندازی

چیجوری میشه یه مثال بزاری

zayens
دوشنبه 16 شهریور 1394, 12:08 عصر
اینجوری
this.Invoke((MethodInvoker)delegate() { a.Fill(t);});

FastCode
دوشنبه 16 شهریور 1394, 12:11 عصر
برای method های static از reference استفاده نکنید.

this.Invoke
باید بشود:

Control.Invoke

esagraphic
دوشنبه 16 شهریور 1394, 12:33 عصر
برای method های static از reference استفاده نکنید.

this.Invoke
باید بشود:

Control.Invoke

تفاوتش در چیست ؟

FastCode
دوشنبه 16 شهریور 1394, 12:37 عصر
تفاوتش در چیست ؟

اگر بعدا متود ه Instance ی با همین نام اضافه بشه کدتون از کار میافته.

esagraphic
دوشنبه 16 شهریور 1394, 12:49 عصر
اگر بعدا متود ه Instance ی با همین نام اضافه بشه کدتون از کار میافته.به جای this از کنترول استفاده میکنم اما ایرور میده یعنی همچین چیزی نداره control.invoke(methodinvoker)

FastCode
دوشنبه 16 شهریور 1394, 13:00 عصر
پس این رو آزمایش کنید:

datagrid.Invoke(()=>datagrid.DataSource=t);

فکر میکنم اشتباه کردم.
به هر حال بهتره که از reference همون control که گریدتون هست استفاده کنید.