PDA

View Full Version : به دست اوردن id یک ردیف در datagridview



text@123
یک شنبه 19 مهر 1394, 22:56 عصر
سلام

یه دیتا گرید ویو دارم که یه ستونش رو به صورت چک باکس گذاشتم
برنامه ام به این صورته که کاربر یه تعداد ردیف ها رو انتخاب میکنه یعنی چک باکس ردیفای موردنظرشو تیک میزنه و بعد روی دکمه ذخیره کلیک میکنه که تغییرات تو دیتابیس ذخیره بشن

مشکلم اینجاس که چه جور مشخص کنم که چه ردیفی انخاب شده
نمیدونم که از selectedrowچه جور استفاده میشه
لطفا راهنماییم کنید


وقتم زیاد نیست و عجله دارم:ناراحت:

esagraphic
دوشنبه 20 مهر 1394, 09:19 صبح
سلام
اگه میخواهی آبدیت کنی و از روی دیتا گرید ویو انتخاب کنی اون مقدار که میخواهی ادیت کنی این کارو بکن
اول اون فیلد که آی دی شما ذخیره است را بدست بیا با بقیه مشخصات بعد توسط همون آی دی میتونی ادیت کنی
مثال زیر را دقت کن من از دیتا گرید ویو آی دی ، اسم ، اسم پدر را میگیرم برای ادیت برای این کار من هم میتونم توی تکس باکس ذخیره کنم هم توی رشته چیزی


string id = datagidview1[0,datagridview.currentrow.index].value.tostring;



با همون روشی بالا ببین خانه شماره 0 مال آی دی من تو دیتا گرید ویو است شما با همین روش میتونی هر فیلد را بدست بیاری بعد آبدیت کنی

aria2006
دوشنبه 20 مهر 1394, 17:44 عصر
سلام من هم تقریبا همین مشکل دوستمون text@123 رو دارم
من یه دیتاگرید ویو دارم که 4 تا ستون داره و ستون چهارمش یه چک باکسه... حالا من میخوام در هر ردیفی که تیک خورده حذف کنم... با کد وقتی یه ردیفو انتخاب میکنم عمل حذف انجام میشه ولی وقتی بیش از یک چک باکس تیک میخورن موقع حذف خطا میگیره... اینم بگم من ستونهای دیتاگریدمو از پروپرتی دیتاگرید(ویزارد) تعریف کردم و delcell نام ستونیه که چک باکسه. دوستان لطفا راهنمایی بفرمایند چگونه میتونم هر تعداد ردیفی که چک باکس اونا فعال بود رو حذف کنم ؟؟


private void delete_btn_Click(object sender, EventArgs e)
{

int t = dataGridView1.RowCount;
for (int i =0; i < t; i++)
{

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

{

SqlCommand cmd = new SqlCommand("delete from A_archive where persenel_no=@code and radif=@rad", myconstr.con);
cmd.Parameters.AddWithValue("@code", code_p.Text);
cmd.Parameters.AddWithValue("@rad",dataGridView1.Rows[i].Cells["radif"].Value);
myconstr.con.Open();
cmd.ExecuteNonQuery();
myconstr.con.Close();
MessageBox.Show("حذف شد");


}


}

}

rg_BlackRose
سه شنبه 21 مهر 1394, 00:29 صبح
سلام

یه دیتا گرید ویو دارم که یه ستونش رو به صورت چک باکس گذاشتم
برنامه ام به این صورته که کاربر یه تعداد ردیف ها رو انتخاب میکنه یعنی چک باکس ردیفای موردنظرشو تیک میزنه و بعد روی دکمه ذخیره کلیک میکنه که تغییرات تو دیتابیس ذخیره بشن

مشکلم اینجاس که چه جور مشخص کنم که چه ردیفی انخاب شده
نمیدونم که از selectedrowچه جور استفاده میشه
لطفا راهنماییم کنید


وقتم زیاد نیست و عجله دارم:ناراحت:


سلام

خاصیت SelectedRow سطرهای Select شده از DataGridView رو برمیگردونه.(نه سطرهایی که CheckBox داره و تیک خوردن).

شما به دو روش میتونید به خواسته تون برسید.

1. یا باید ستون CheckBox رو از DataGridView حذف کنید. و از خاصیت SelectedRow برای بدست آوردن سطرهای انتخا شده استفاده کنید.

مثال:

foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Selected)
{
//کارهایی که میخواهید در صورت انتخاب بودن سطر مورد نظر انجام بدید رو اینجا بنویسید
}
}



2. یا اینکه ستون CheckBox باشه و شما سطرهایی که تیک خوردن رو بدست بیارید.

مثال:

foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToBoolean(row.Cells[نام یا ایندکس ستون دارای چک باکس].Value))
{
//کارهایی که میخواهید در صورت چکدار بودن سطر مورد نظر انجام بدید رو اینجا بنویسید
}
}


موفق باشید

rg_BlackRose
سه شنبه 21 مهر 1394, 01:20 صبح
سلام من هم تقریبا همین مشکل دوستمون text@123 رو دارم
من یه دیتاگرید ویو دارم که 4 تا ستون داره و ستون چهارمش یه چک باکسه... حالا من میخوام در هر ردیفی که تیک خورده حذف کنم... با کد وقتی یه ردیفو انتخاب میکنم عمل حذف انجام میشه ولی وقتی بیش از یک چک باکس تیک میخورن موقع حذف خطا میگیره... اینم بگم من ستونهای دیتاگریدمو از پروپرتی دیتاگرید(ویزارد) تعریف کردم و delcell نام ستونیه که چک باکسه. دوستان لطفا راهنمایی بفرمایند چگونه میتونم هر تعداد ردیفی که چک باکس اونا فعال بود رو حذف کنم ؟؟


private void delete_btn_Click(object sender, EventArgs e)
{

int t = dataGridView1.RowCount;
for (int i =0; i < t; i++)
{

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

{

SqlCommand cmd = new SqlCommand("delete from A_archive where persenel_no=@code and radif=@rad", myconstr.con);
cmd.Parameters.AddWithValue("@code", code_p.Text);
cmd.Parameters.AddWithValue("@rad",dataGridView1.Rows[i].Cells["radif"].Value);
myconstr.con.Open();
cmd.ExecuteNonQuery();
myconstr.con.Close();
MessageBox.Show("حذف شد");


}


}

}





سلام

شما بجای حلقه for از foreach استفاده کنید مشکلتون حل میشه.(با اجازتون من کدهاتون رو کمی ویراش کردم.)

این تابع رو به کدهای کلاس فرمتون اضافه کند.(این تابغ تعداد سطرهای تیک خورده رو برمیگردونه) البته اختیاریه.

int GetCheckedCount(DataGridView gridView, int columnIndex)
{
return (gridView.Rows.Cast<DataGridViewRow>()
.Where(rows => Convert.ToBoolean(rows.Cells[columnIndex].Value) == true)).Count();
}


این هم کدها ویرایش شده:

private void delete_btn_Click(object sender, EventArgs e)
{
int i = 0;
SqlConnection myConnection = new SqlConnection("کانکشن استرینگ");


foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToBoolean(row.Cells[نام یا ایندکس ستون دارای چک باکس].Value))
{
string pCode = code_p.Text;//اینجا باید کد پرسنلی دوباره بازخوانی شود

try
{
SqlCommand cmd = myConnection.CreateCommand();
cmd.CommandType=CommandType.Text;
cmd.CommandText = "DELETE FROM A_archive WHERE persenel_no = @code and radif = @rad";
cmd.Parameters.AddWithValue("@code", pCode);
cmd.Parameters.AddWithValue("@rad", row.Cells["radif"].Value);


if(myConnection.State == ConnectionState.Closed)
myConnection.Open();


cmd.ExecuteNonQuery();


i++;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
myConnection.Close();
}

}
}


int checkedrowscount = GetCheckedCount(dataGridView1,ایندکس ستون دارای چک باکس);
MessageBox.Show("تعداد " + i.ToString() + " سطر از " + checkedrowscount.ToString() + " سطر انتخا شده حذف شد");

}


هر جایی مشکل داشت بگید تا بررسی کنم.

موفق باشید.

aria2006
سه شنبه 21 مهر 1394, 11:02 صبح
جناب rg_BlackRose (http://barnamenevis.org/member.php?270069-rg_BlackRose) ممنون از توجهتون
راستش من قبلا سراغ foreach رفته بودم ... منتها چون من دیتاگرید ویو و فرمهامو از کامپوننتهای telerik استفاده کردم نمیدونم چرا از foreach واسه این قسمت ایراد میگیره.... خطاش در عکس زیر هست.
135994

text@123
سه شنبه 21 مهر 1394, 14:20 عصر
سپاس از راهنمایی ارزشمندتون:لبخند:

موفق باشید

rg_BlackRose
سه شنبه 21 مهر 1394, 15:35 عصر
جناب rg_BlackRose (http://barnamenevis.org/member.php?270069-rg_BlackRose) ممنون از توجهتون
راستش من قبلا سراغ foreach رفته بودم ... منتها چون من دیتاگرید ویو و فرمهامو از کامپوننتهای telerik استفاده کردم نمیدونم چرا از foreach واسه این قسمت ایراد میگیره.... خطاش در عکس زیر هست.
135994

با سلام مجدد

من تا حالا از کامپوننت تلریک استفاده نکردم. ولی این پیغام بیانگر این هست که، دیتاگرید تلریک از Telerik.WinControls.UI.riViewRowInfo به جای DataGridViewRow استفاده میکنه. پس قائدتا با تغییر و جایگزین این دو (و احتمالا تغییرات جزئی در کدها) بتونید از foreach استفاده کنید.

و اما دلیل اینکه گفتم از foreach استفاده کنید.

شما فرص کنید سطر جاری (خط اول) رو حذف کند، در این حالت سطر دو جایگزین سطر یک میشه و درون حلقه شمارنده سطر به علاوه یک میشه. یعنی در اصل میره و سطر شماره سه رو پردازش میکنه. و یک سطر از قلم میافته.(شاید خطایی که در پست قبلی اتفاق میافتاد به خاطر همن مسئله باشه). امدوارم مشکلتون حل بشه.

موفق باشد.

aria2006
چهارشنبه 22 مهر 1394, 07:54 صبح
با سلام مجدد

من تا حالا از کامپوننت تلریک استفاده نکردم. ولی این پیغام بیانگر این هست که، دیتاگرید تلریک از Telerik.WinControls.UI.riViewRowInfo به جای DataGridViewRow استفاده میکنه. پس قائدتا با تغییر و جایگزین این دو (و احتمالا تغییرات جزئی در کدها) بتونید از foreach استفاده کنید.

و اما دلیل اینکه گفتم از foreach استفاده کنید.

شما فرص کنید سطر جاری (خط اول) رو حذف کند، در این حالت سطر دو جایگزین سطر یک میشه و درون حلقه شمارنده سطر به علاوه یک میشه. یعنی در اصل میره و سطر شماره سه رو پردازش میکنه. و یک سطر از قلم میافته.(شاید خطایی که در پست قبلی اتفاق میافتاد به خاطر همن مسئله باشه). امدوارم مشکلتون حل بشه.

موفق باشد.

سلام
من خطای خود حلقه foreach رو برطرف کردم ولی جای دیگه خطا میگرفت کلا foreach با دیتاگرید تلریک سر ناسازگاری داشت...
اما بدون foreach هم میشه و با یه حلقه for ساده این کارو بصورت دقیق واونجور که خودم میخواستم انجام شد... این که شما گفتید اگه foreach نباشه و سطر جاری (خط اول) را حذف رو حذف کند سط دو جایگزین سطر یک میشه و ترتیب حذف سطرها بهم میخوره و.... این در صورتیه که شما درون حلقه for بیای دیتاگرید رو رفرش کنی اونوقت حق با شماست... ولی من بعد از اینکه حلقه کارشو تموم کرد و خارج شد در پایان کار دیتاگریدمو رفرش میکنم... کد زیر بدون مشکل کارشو انجام میده و هر تعداد سطر با هر ترتیبی از دیتاگرید رو که چک باکس اون تیک داشته باشه رو بدون خطا و باگ حذف خواهد کرد...:لبخندساده:




private void delete_btn_Click(object sender, EventArgs e)
{

int t = dataGridView1.RowCount;

int tedadhazf=0;

for (int i =0; i <= t-1; i++)
{

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

{

SqlCommand cmd = new SqlCommand("delete from A_archive where persenel_no=@code and radif=@rad", myconstr.con);
cmd.Parameters.AddWithValue("@code", code_p.Text);
cmd.Parameters.AddWithValue("@rad",dataGridView1.Rows[i].Cells["radif"].Value);
myconstr.con.Open();
cmd.ExecuteNonQuery();
myconstr.con.Close();
tedadhazf++;// برای شمارش تعداد سطرهای تیک خورده یا حذف شده
}
}

if (tedadhazf > 0)
{
code_o.Text = string.Empty;
name_o.Text = string.Empty;
date_s.Text = string.Empty;
adrspic.Text = string.Empty;
sanadpic.Image = null;
radif_no.Value = 1;
x = true;
archive1_Load(null, null);// با این فراخوانی دیتاگرید رفرش میشه
MessageBox.Show(" تعداد " + tedadhazf.ToString() + " سطر حذف شد");
}
else
{
MessageBox.Show("ابتدا مربع سطر مربوطه را تیک بزنید");
}


}