PDA

View Full Version : سوال: خطا به هنگام حذف داده از datagridview



rayson
یک شنبه 10 شهریور 1392, 18:58 عصر
سلام.
من با کد درون دیتا گرید برای هر سطر یک چک باکس تعریف کردم و میخوام زمانی که تیک انتخاب میشه و دکمه حذف زده بشود داده مورد نظر حذف شود ، البته یک چک باکس هم در بالا همه سطر ها وجود دارد که اگر زده شود تمام چک باکس ها انتخاب میشود .
کد مورد نظر به شکل زیر است اما خطا زیر را میدهد لطفا راهنمایی کنید.
با تشکر.


کد حذف درون دکمه :
List<int> ChkedRow = new List<int>();
DataRow dr;

for (int i = 0; i <= karkard_dgv_karkard.RowCount - 1 ; i++)
{
if (Convert.ToBoolean(karkard_dgv_karkard.Rows[i].Cells["chkcol"].Value) == true)
{
ChkedRow.Add(i);
}
}

foreach (int k in ChkedRow)
{
dr = dt.Rows[k];
dt.Rows[k].Delete();


}



کد نمایش و تغییرات چک باکس ها:
private void chkBoxChange(object sender, EventArgs e)
{
for (int k = 0; k <= karkard_dgv_karkard.RowCount - 1; k++)
{
this.karkard_dgv_karkard[0,k].Value = this.chkbox.Checked;
}
this.karkard_dgv_karkard.EndEdit();
}
void loadGrid()
{
karkard_dgv_karkard.AllowUserToAddRows = false;


karkard_dgv_karkard.Columns.Clear();
DataGridViewCheckBoxColumn colcb = new DataGridViewCheckBoxColumn();

colcb.Name = "chkcol";
colcb.HeaderText = "";
colcb.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;

karkard_dgv_karkard.Columns.Add(colcb);




Rectangle rect = this.karkard_dgv_karkard.GetCellDisplayRectangle(0 , -1, true); //0 Column index -1(header row) is row index


chkbox.Size = new Size(18, 18);


rect.Offset(40,2);
chkbox.Location = rect.Location;

chkbox.CheckedChanged += chkBoxChange;

this.karkard_dgv_karkard.Controls.Add(chkbox);


karkard_dgv_karkard.DataSource = dt;
}



خطا و همچنین ستون های دیتا گرید. ( نکته ای که یادم رفت بگم این است که آی دی جدولم درون دیتا گرید نمایش داده نمیشود یعنی هنگام سلکت کردن فقط داده های مورد نیاز را از جدول فراخوانی کردم)

جدول:
http://www.uploadtak.com/images/8568_DgV.jpg
خطا:
http://www.uploadtak.com/images/s562_DgV1.jpg

veniz2008
یک شنبه 10 شهریور 1392, 20:30 عصر
سلام.
نمیدونم این همه کد واسه چیه ولی اگر میخوای همزمان چندین رکورد رو حذف کنی یه راهش استفاده از قطعه کد زیر هست.
در این روش درون یه حلقه، هر سطری که تیک اون زده شده، آی دی اون (کلید جدولت) برداشته میشه و بعدش در خارج از حلقه با یکبار وصل شدن به دیتابیس، اون رکوردها رو حذف میکنه.


string s = "";

for (int i = 0; i <= karkard_dgv_karkard.RowCount - 1; i++)
{
if(Convert.ToBoolean(karkard_dgv_karkard.Rows[i].Cells["chkcol"].Value) == true)
{
// شماره یا نام سلولی که آی دی جدولت درون اون قرار داره رو جایگزین کد زیر کن

s = s + dataGridView1.Rows[i].Cells[1].Value + ",";
}
}
s = s.Remove(s.Length - 1, 1);
SqlConnection con = new SqlConnection("Data source =(local);initial catalog = testgrid;integrated security = true");
SqlCommand cmd = new SqlCommand("delete from student where id in (" + s + ")", con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();

rayson
یک شنبه 10 شهریور 1392, 23:06 عصر
خطا میده که نمیتونه آی دی جدول را پیدا کنه ، چطوری باید آی دی را بهش بشناسونم ؟
s = s + karkard_dgv_karkard.Rows[i].Cells["id_karkard"].Value+ ",";
http://www.uploadtak.com/viewer.php?file=z7361_dgv3.jpg

veniz2008
یک شنبه 10 شهریور 1392, 23:41 عصر
خطا میده که نمیتونه آی دی جدول را پیدا کنه ، چطوری باید آی دی را بهش بشناسونم ؟
s = s + karkard_dgv_karkard.Rows[i].Cells["id_karkard"].Value+ ",";
http://www.uploadtak.com/viewer.php?file=z7361_dgv3.jpg
عزیز من، شما باید ستونی رو بدی که وجود خارجی داشته باشه. ستون جدولت ملاک نیست. مهم نام ستون گرید هست. آیا ستون گرید شما اسمش id_karkard هست؟
برای راحتی کار خودت به جای نام ستون از شماره ایندکس ستون گرید استفاده کن (توجه کن که اولین سلول گرید ایندکسش 0 هست).
مثلا اگر ستون id_karkard اولین ستون گرید هست اینطور بنویس :

s = s + karkard_dgv_karkard.Rows[i].Cells[0].Value+ ",";


راستی عکس هاتو همینجا تو برنامه نویس آپلود کن.
آپلود سنتری که عکس روش میزاری ( uploadtak.com (http://www.uploadtak.com/viewer.php?file=z7361_dgv3.jpg) ) مشکل امنیتی داره.

rayson
دوشنبه 11 شهریور 1392, 00:46 صبح
مرسی بابت راهنمایی ، من فکر کردم حتما باید با اسم فیلد حذف کرد اگر با شماره ستون میشود که بسیار بهتر ، یک مشکل و یک سوال ایجاد میشود .
زمانی که حذف میزنم تمام داده ها حذف میشوند.
داده هایی که درون دیتا گرید نمایش داده میشوند نتیجه جستجو میباشند که به 3 روش (سال) ( کد عضویت ) ( سال و کد عضویت) بعد از زدن تیک یکی از این 3 حالت و وارد کردن مقدار مورد نیاز و زدن جستجو درون دیتاگرید نمایش داده میشود. حال من چطوری بعد از حذف داده دیتا گرید را بدون مشکل باید رفرش کنم ؟
با تشکر

veniz2008
دوشنبه 11 شهریور 1392, 01:38 صبح
زمانی که حذف میزنم تمام داده ها حذف میشوند.
نباید چنین مشکلی پیش بیاد.
اون if ای که گذاشتیم وظیفه اش اینه که سطر گرید رو چک کنه که آیا چک باکسش تیک خورده یا نه. اگر تیک خورده بود اونوقت id اش رو برمیداره نه اینکه همه رکوردها رو id هاشون رو برداره و همه رو حذف کنه.

داده هایی که درون دیتا گرید نمایش داده میشوند نتیجه جستجو میباشند که به 3 روش (سال) ( کد عضویت ) ( سال و کد عضویت) بعد از زدن تیک یکی از این 3 حالت و وارد کردن مقدار مورد نیاز و زدن جستجو درون دیتاگرید نمایش داده میشود. حال من چطوری بعد از حذف داده دیتا گرید را بدون مشکل باید رفرش کنم ؟
با تشکر در مورد رفرش کردن دیتاگرید بسیار زیاد بحث شده. همین عبارت (یا عبارات مشابه) رو در جستجوی سایت سرچ کن.

benefid
شنبه 30 شهریور 1392, 08:49 صبح
میشه لطفا برای بندهتوضیح دهید که چگونه می توان با کد درون دیتا گرید برای هر سطر یک چک باکس تعریف کرد و البته یک چک باکس هم در بالا همه سطر ها که اگر زده شود تمام چک باکس ها انتخاب شود ؟؟؟؟؟؟؟؟