PDA

View Full Version : اشکال در حلقه foreach



minabr
سه شنبه 26 دی 1391, 20:36 عصر
من در برنامه ی خودم از کد زیر برای پیمایش ردیف های یک دیتاگرید ویو استفاده کردم تا هر کدام از ردیف هایی رو که chek box آن تیک خورده بود رو پاک کنم ولی متاسفانه با اجرای این حلقه تنها آخرین رکوردی که تیک خورده پاک می شود یا به عبارتی آخرین رکوردی که chek box آن را تغییر دادم چون گاهی پیش آمده که در آخرین لحظه تیک یکی از آن ها رو برداشتم اما همان ردیف که تیک آن را برداشتم پاک می شود. (آخرین ردیف تغییر کرده).
چکار کنم که حتما تمامی ردیف هایی که تیک دارند پاک شوند؟

foreach (DataGridViewRow x in dGVBedehkaran.Rows)
{
if (x.Cells[0].Selected == true)
{
try
{
da2 = new SqlDataAdapter("delete from bedehi where be_date='" + x.Cells[1].Value.ToString() + "'", con1);
dt2 = new DataTable();
da2.Fill(dt2);
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
}

saied_hacker
سه شنبه 26 دی 1391, 20:57 عصر
احتمالا مشکل از اینجاس نه خود حلقه :)
x.Cells[0].Selected == true

اخه شما میگی اون ردیفی که انتخاب شده فلان کار روش انجام بشه ( خودتونم میگید یه ادیتی رو روی یکی انجام دادید و اون پاک شده چون اون انتخاب شده ).
شما اصلا مقدار اون خونه رو بررسی نمی کنید.
شما باید مقدارش رو بررسی کنید.ببنید فیلد/پراپرتی value نداره ؟!

مهرداد صفا
چهارشنبه 27 دی 1391, 15:01 عصر
با سلام
خصوصیت Selected مشخص میکند که Cell انتخاب شده است یا نه و چون آخرین سلولی که آن را ویرایش میکنید Focus دارد و در حالت انتخاب قرار دارد حذف میشود.

group45
چهارشنبه 27 دی 1391, 18:44 عصر
با سلام
برای این کار یه ایونت هست مخصوص دیتاگریدویو به اسم selectedcell تو این کدتون رو بنویسید هر بار که هر رکوردی انتخاب میشه این ایونت اونو پاک کنه

minabr
چهارشنبه 27 دی 1391, 19:32 عصر
با سلام
خصوصیت Selected مشخص میکند که Cell انتخاب شده است یا نه و چون آخرین سلولی که آن را ویرایش میکنید Focus دارد و در حالت انتخاب قرار دارد حذف میشود.

خوب حالا راه حلش چیه؟ لطفا کمکم کنید.:ناراحت:

Mahmoud.Afrad
چهارشنبه 27 دی 1391, 21:23 عصر
باید مقدار سلول را مقایسه کنید:
if (Convert.ToBoolean(x.Cells[0].Value) == true)

group45
چهارشنبه 27 دی 1391, 23:24 عصر
خوب حالا راه حلش چیه؟ لطفا کمکم کنید.:ناراحت:
با سلام
اسم کامل ایونت هست cell mouse click که اگه یه سلول یک بار با موس روش کلیک بشه فعال میشه. e به شما کمک میکنه تا اندیس ردیف رو پیدا کنید. و با مراجعه به اون column که منحصر بفرده و بدست آوردن مقدارش اونو پاک کنید

minabr
جمعه 29 دی 1391, 17:16 عصر
باید مقدار سلول را مقایسه کنید:
if (Convert.ToBoolean(x.Cells[0].Value) == true)

بی نهایت ازتون متشکرم. مشکلم با جواب خوب شما حل شد.

minabr
شنبه 30 دی 1391, 23:52 عصر
باید مقدار سلول را مقایسه کنید:
if (Convert.ToBoolean(x.Cells[0].Value) == true)

دوست عزیز، همانطور که گفتم مشکلم با جواب شما حل شد اما فکر می کنم یک اشکال دیگه هم وجود داره چون برنامه رو که اجرا می کنم اولین رکوردی که تیک خورده رو پاک می کنه و بقیه رو پاک نمیکنه. خودم فکر کنم اشکال از data set‌ باشه، احتمالا باید پاک بشه. درسته؟ به نظر شما مشکل از کجاست و راه حلش چیه؟

foreach (DataGridViewRow x in dGVPayment.Rows)
{
if (Convert.ToBoolean(x.Cells[1].Value) == true)
{
idpay = x.Cells[0].Value.ToString();
try
{
da8 = new SqlDataAdapter("delete from payments where id='" + idpay + "'", con1);
dt8 = new DataTable();
da8.Fill(dt8);
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
dGVPayment.Rows.Remove(x);
}
}

Mahmoud.Afrad
یک شنبه 01 بهمن 1391, 02:50 صبح
برای حذف همه سطرهای تیک خورده از حلقه for استفاده کنید. برای پیمایش هم از آخرین سطر گریدویو چک کنید و هر بار شمارنده حلقه رو یک واحد کم کنید.
حذف سطر از گریدویو باید داخل try و بعد از حذف از دیتابیس باشه تا درصورتی که در هنگام حذف از دیتابیس خطا پیش آمد و از دیتابیس حذف نشد ، سطر از گریدویو هم حذف نشه.
برای اعمالی مثل درج و حذف و آپدیت از sqlcommand استفاده کنید:

using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = con1;
con1.Open();
for (int i = dGVPayment.RowCount - 1; i >= 0; i--)
{
if (Convert.ToBoolean(dGVPayment.Rows[i].Cells[1].Value) == true)
{
try
{
cmd.CommandText = "delete from payments where id='" + dGVPayment.Rows[i].Cells[0].Value + "'";
cmd.ExecuteNonQuery();
// After row deleted from databese , delete row from datagridview.
dGVPayment.Rows.RemoveAt(i);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
con1.Close();
}