PDA

View Full Version : سوال: حذف رکوردهای تیک زده شده در GridView



veniz2008
یک شنبه 28 خرداد 1391, 20:25 عصر
سلام،هرچی جستجو کردم به نتیجه نرسیدم.اما سوال: من اطلاعات جدول رو داخل گریدویو نمایش دادم و یک ستون از نوع checkbox به گرید اضافه کردم(هر رکورد یه checkbox داره)،حالا میخوام کاربر هر کدوم از رکوردها رو که خواست تیک بزنه و اون رکوردها حذف بشن،من از کد زیر استفاده میکنم ولی فقط آخرین رکوردی که تیک میخوره رو حذف میکنه،از چه دستوری باید استفاده کنم تا رکوردهای تیک زده شده رو تشخیص بدم؟، (سلول سوم همون سلولی هست که چک باکس درون اون هستش).

int t = dataGridView1.Rows.Count;
for (int i = 0; i <= t - 1; i++)
{
if (dataGridView1.Rows[i].Cells[3].Selected == true)
{
int getid = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value.ToString());
con = new SqlConnection("Data source =(local);initial catalog = testgrid;integrated security = true");
con.Open();
SqlCommand cmd = new SqlCommand("delete from student where id =" + getid + "", con);
cmd.ExecuteNonQuery();
}
}

veniz2008
یک شنبه 28 خرداد 1391, 21:56 عصر
مرسی پسر خوب ولی خصوصیاتی که گفتید رو چک باکس نداشت،دوستان چه پیشنهادی میدن که این مشکل حل شه؟

مرتضی تقدمی
دوشنبه 29 خرداد 1391, 01:39 صبح
سلام
اینجور برنامه نوشتن که به ازای حذف هر رکورد یه بار به بانک وصل شه صحیح نیست. به این روش عمل کنید. ابتدا در یک حلقه, کد ردیف های انتخابی رو در یک رشته بریزید. بعد از این رشته به عنوان شرط کوئری حذف, استفاده کنید. با دستور In در کوئری. به این شکل:


delete from tbl where id in (" + s + ")

که رشته s شامل کدها به صورت 1,2,3,... است.
نمونه برنامه رو ببینید.
موفق باشید.

Saman Ice
دوشنبه 29 خرداد 1391, 03:08 صبح
string strID = string.Empty;
for (int i = 0; i < GridView1.Rows.Count; i++)
{
CheckBox chkDelete = (CheckBox)GridView1.Rows[i].Cells[0].FindControl("CheckBox1");
if (chkDelete.Checked)
{
strID = (GridView1.Rows[i].Cells[1].Text).ToString();
SqlConnection conn = new SqlConnection("Data Source=saman-pc;Initial Catalog=University;Integrated Security=True");
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
string qeury = "DELETE FROM selectunits WHERE studentid='" + int.Parse(idnum.Text) + "' and lessonid='" + int.Parse(strID) + "'";
cmd.CommandText = qeury;
cmd.ExecuteNonQuery();
conn.Close();
}
}

barnamenevisforme
دوشنبه 29 خرداد 1391, 07:11 صبح
سلام
به ازای هر سطر تیک خورده،سطر معادل dataset رو پاک کن،بعد متد tableadapter.update رو فراخونی کن و dataset رو به اون پاس بده.
How to delete records via update method

sirvan-me
دوشنبه 29 خرداد 1391, 10:54 صبح
سلام
اینجور برنامه نوشتن که به ازای حذف هر رکورد یه بار به بانک وصل شه صحیح نیست. به این روش عمل کنید. ابتدا در یک حلقه, کد ردیف های انتخابی رو در یک رشته بریزید. بعد از این رشته به عنوان شرط کوئری حذف, استفاده کنید. با دستور In در کوئری. به این شکل:


delete from tbl where id in (" + s + ")

که رشته s شامل کدها به صورت 1,2,3,... است.
نمونه برنامه رو ببینید.
موفق باشید.

وقتی کدی رو که گفتین به صورت Query می نویسم جواب نمیده ....
میشه بگین IN نقشش تو این Query چیه ؟

مرتضی تقدمی
دوشنبه 29 خرداد 1391, 11:00 صبح
وقتی می گیم:


delete from tbl where id in (" + s + ")

یعنی اینکه اگر مقدار ستون id در یکی از مقدارهای داخل s بود, بیاد اون سطر رو حذف کنه.
مثلا 5 تا سطر داری که مقدار id اونها بصورت زیره:
2005
2006
2007
2008
2009

خب, حالا مثلا می خوای سطر با id های 2005 و 2008 و 2009 رو حذف کنی. کوئری بصورت زیر میشه:


delete from tbl where id in (2005,2008,2009)

sirvan-me
دوشنبه 29 خرداد 1391, 11:04 صبح
فهمیدم مشکل چی بود من این خط کد رو حواسم نبود بزارم :

s = s.Remove(s.Length - 1, 1);

مرسی فقط در رابطه با IN اگه توضیح بدین ممنون میشم

sirvan-me
دوشنبه 29 خرداد 1391, 11:21 صبح
عذر می خوام اما سوال دیگه این کلمه ی کلیدی IN که گفتین می شه رو فیلدهای از نوع Nvarchar یا هر نوع دیگه ای به کار برد ؟

veniz2008
دوشنبه 29 خرداد 1391, 12:05 عصر
آقای تقدمی فکر کنم این روش روی فیلدهای رشته ای جواب نمیده یعنی اگه id رو از نوع nchar انتخاب کنبم و کوئری رو بصورت زیر بنویسیم جواب نمیده،لطفا راهنمایی کنید.

SqlCommand cmd = new SqlCommand("delete from student where id in ('" + s + "')", con);

Mahmoud.Afrad
دوشنبه 29 خرداد 1391, 12:36 عصر
من تست کردم کوئری مشکلی نداره
delete from tbl where name in ('name1' , 'name2' , .... ) میتونی با یک حلقه اون سطرهایی رو که تیک خورده به کوئری اضافه کنی و یک بار این کوئری رو اجرا کنی.

مرتضی تقدمی
دوشنبه 29 خرداد 1391, 12:37 عصر
اگر فیلد شما از نوع رشته است, باید تک تک مقادیر رو داخل ' ' قرار بدید.

veniz2008
دوشنبه 29 خرداد 1391, 12:52 عصر
اگر فیلد شما از نوع رشته است, باید تک تک مقادیر رو داخل ' ' قرار بدید.
یعنی چطوری؟اگه بیشتر از یک رکورد رو تیک بزنم هیچکدوم رو حذف نمیکنه ولی اگه فقط یکی رو تیک بزنم حذف میکنه، ببینید من کد کامل رو میذارم لطفا بگید کجاشو باید اصلاح کنم،هرچی باهاش ور رفتم جواب نداد.

string s = "";
int t = dataGridView1.Rows.Count;

for (int i = 0; i <= t - 1; i++)
{
if (dataGridView1.Rows[i].Cells[4].Value != null)
{

s = s + dataGridView1.Rows[i].Cells[1].Value +",";
}
}

s = s.Remove(s.Length - 1, 1);
con = new SqlConnection("Data source =(local);initial catalog = testgrid;integrated security = true");
con.Open();
SqlCommand cmd = new SqlCommand("delete from student where id2 in ('" + s + "')", con);
cmd.ExecuteNonQuery();

مرتضی تقدمی
دوشنبه 29 خرداد 1391, 13:00 عصر
فیلدهای جدول + نوع آنها و ستونهای dgv رو لطفا بگید.

sirvan-me
دوشنبه 29 خرداد 1391, 13:13 عصر
SqlCommand cmd = new SqlCommand("delete from student where id2 in ('" + s + "')", con);

این کدی که شما زدین تک تک مقادیر Nvarchar که از یک ستون دیتاگریدتون میگیرین رو تو ' ' قرار نمیده ، فقط اول آخر رشته این کار رو می کنه !!!!!!!! باید به این صورت بنویسین ( من نوشتم درست شد ) :

s = s +"'" +dtgv.Rows[i].Cells[1].Value+"'" + ",";

مرتضی تقدمی
دوشنبه 29 خرداد 1391, 13:16 عصر
خب شما هم نگفتید که نوع داده رشته هست. کد رو معمولا عددی می گیرن. حالا هم کار سختی نیست, با یه تغییر, داخل ' ' بذار.

veniz2008
دوشنبه 29 خرداد 1391, 13:17 عصر
اون مشکل حل شد،الان موقع تست به یه مشکل جدید برخوردم،وقتی تیک یک رکورد رو میزنم و بعدش تیک رو برمیدارم موقع حذف کردن اون رکورد رو با وجود اینکه تیکش رو برداشتم حذف میکنه(فیلدهایجدولم: id از نوع int، فیلد id2 از نوع nchar، نام و فامیلی از نوع nvarchar)، من احتمال میدم که مشکل از شرط if باشه:

if (dataGridView1.Rows[i].Cells[4].Value != null)
با تیک زدنش مقدار null از بین میره و حتی وقتی تیکش روبرمیدارم همچنان همونطوری باقی میمونه

مرتضی تقدمی
دوشنبه 29 خرداد 1391, 13:19 عصر
اگر از نوع checkbox هست چرا با null مقایسه کردی؟! نمونه برنامه ای که قرار دادم رو لطفا ببین.

veniz2008
دوشنبه 29 خرداد 1391, 13:36 عصر
با راهنمایی شما مشکل حل شد،باید بصورت زیر مینوشتم:

if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[4].Value) == true)