PDA

View Full Version : تغییر چک باکس در دیتاگریدویو



maikola
جمعه 17 تیر 1390, 21:33 عصر
سلام
من در فرمم یه دیتاگریدویو دارم یکی از ستونهاش چک باکس هست و قابل edit هست
حالا تو برنامم میخوام هر وقت هرتعداد از چک باکسها تیکدار شد یه نمایشگر تعداد چک باکسهای تیکدار رو نشون بده
تقریبا تمام event های دیتاگرید رو امتحان کردم ولی هیچکدوم درست این عمل رو انجام نمیدن
ممنون میشم راهنماییم کنید

flash118
جمعه 17 تیر 1390, 23:19 عصر
دوست عزیز با این که من منظورتون رو از نمایشگر چک باکس رو هنوز نگرفتم ولی با این وجود فعلا این لینک ها رو نگاه کنید اگه مشکلتون رفع نشده کمی روشن تر توضیح بدید تا با همفکری کد بهینه ارائه دهیم
لینک اول:http://msdn.microsoft.com/en-us/library/bxt3k60s.aspx
لینک دوم:http://social.msdn.microsoft.com/forums/en-US/winforms/thread/67adfbff-2c69-4fea-bc8c-8dd8c6ac0dbf/
لینک سوم:http://www.codeproject.com/KB/grid/DataGridView_winforms.aspx

maikola
جمعه 17 تیر 1390, 23:39 عصر
ممنون از لینک هایی که گذاشتید
منظورم از نمایشگر یه لیبل هست که در هر لحظه باید تعداد چک باکسهای تیکدار رو نشون بده تقریبا همه رویدادها رو چک کردم ولی درست نشون نمیده تو رویدادها دستورات زیر رو قرار میدم

int k = 0;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[4].Value) == 1)
{
k++;

}


}
countLbl.Text = Convert.ToString(k);72148

ma.rad
شنبه 18 تیر 1390, 00:08 صبح
از کنترل اسنفاده کنید:

foreach (Control C in this.Controls )

if (C isCheckBox && ((CheckBox)C).Checked)
دستورات

maikola
شنبه 18 تیر 1390, 00:22 صبح
تو چه متد یا رویدادی از این کنترل استفاده کنم؟

ma.rad
شنبه 18 تیر 1390, 01:03 صبح
تو رویدادهای : cellclick و mouseclickتست کن

maikola
شنبه 18 تیر 1390, 01:30 صبح
error میده
72152

Esmail Solhkhah
شنبه 18 تیر 1390, 01:38 صبح
اگه دیتاگرید به BindingSource وصله از رویداد ListChanged مربوط به اون استفاده کنید

maikola
شنبه 18 تیر 1390, 02:17 صبح
اگه منظورتون دیتابیس هست از دیتابیس استفاده نمیکنم داده ها از پورت سریال میاد تو یه دیتاتیبل dt میریزم بعد خاصیت دیتاسورس دیتاگرید رو به dt نسبت میدم
this.dataGridView1.DataSource = dt;

Esmail Solhkhah
شنبه 18 تیر 1390, 02:24 صبح
اگه از کامپوننت SerialPort خود VS استفاده کردید از رویداد DataReceived اون استفاده کنید

maikola
شنبه 18 تیر 1390, 02:41 صبح
موقع دریافت اطلاعات از پورت سریال از رویداد datareceived استفاده کردم اونجا مشکلی ندارم
دیتاگریدویو فرمم سه تا ستون فقط خواندنی داره و ستون آخر که boolean هست قابل رایت توسط کاربر هست تا بتونه رکوردهایی که میخواد نمودارش رو ببینه انتخاب کنه
حالا من میخوام وقتی کاربر رکوردهارو با تیکدار کردن چک باکس ستون چهارم انتخاب میکنه تعداد ردیفهای تیکخورده نشون داده بشه از طرفی با دونستن این تعداد فرم گراف رو تنظیم کنم

Esmail Solhkhah
شنبه 18 تیر 1390, 03:15 صبح
از این نمونه کد استفاده کنید
فقط تا زمانی که کاربر روی همون سل فوکوس کرده جواب نمیده وقتی که فوکوس از اون سل خارج شد درسته


int RowCount = 0;
for (int i = 0; i != dataGridView1.Rows.Count; i++)
{

if (dataGridView1.Rows[i].Cells[0].Value != null)
if (dataGridView1.Rows[i].Cells[0].Value.ToString().ToLower() == "true")
RowCount++;

}
this.Text = RowCount.ToString();

ma.rad
شنبه 18 تیر 1390, 09:11 صبح
error میده
72152

چه خطایی میده؟

maikola
شنبه 18 تیر 1390, 10:25 صبح
از این نمونه کد استفاده کنید
فقط تا زمانی که کاربر روی همون سل فوکوس کرده جواب نمیده وقتی که فوکوس از اون سل خارج شد درسته


int RowCount = 0;
for (int i = 0; i != dataGridView1.Rows.Count; i++)
{

if (dataGridView1.Rows[i].Cells[0].Value != null)
if (dataGridView1.Rows[i].Cells[0].Value.ToString().ToLower() == "true")
RowCount++;

}
this.Text = RowCount.ToString();
نتیجه فرقی نکرد مثل قبل وقتی تیک دار میکنم یه دونه کمتر میشماره موقع حذف کردن تیکها هم 3تا تیک باید بردارم تا تازه متوجه شه یه اتفاقی داره میافته کدی که خودم نوشتم هم همینطور هست


خطایی که با دستور (C isCheckBox && ((CheckBox)C).Checked) میده بصورت زیر هست

72176

مرتضی تقدمی
شنبه 18 تیر 1390, 14:19 عصر
سلام

وقتی سلولی در ردیفی از دیتاگرید رو تیک می زنید, اون ردیف در حالت ادیت قرار می گیره زمانی که فوکوس از آن خارج شود تغییرات اعمال می شوند. حالا اگر شما سلولی رو تیک بزنید و همچنان فوکوس بر روی آن باقی باشد, فرض برآن است که آن سلول تیک نخورده است.

برای رفع این مشکل شما می تونید موقع شمارش تیک ها, ردیفی که select شده است رو هم حساب کنید.

امیدوارم مطلب رو گرفته باشید.

موفق باشید.

Boy_nn
شنبه 18 تیر 1390, 15:03 عصر
به نظرم دوستان کار خیلی سختش کردن

private int countDgv()
{
int tCdgv=0;
foreach (DataGridViewRow roww in dataGridView1.Rows)
{
if (bool.Parse(dataGridView1.Rows[roww.Index].Cells["NameColumn"].Value.ToString()))

tCdgv++;

}

return tCdgv;
}

maikola
شنبه 18 تیر 1390, 15:38 عصر
با توجه به پست آقای مرتضوی کد رو بصورت زیر تغییر دادم
private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
Int32 k = 0;
Int32 indexDatagrid=0;
label1.Text = "";
for (Int32 i = 0; i < dataGridView1.Rows.Count; i++)
{
if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[4].Value) == true)
{
k++;

}


}
if (Convert.ToBoolean(dataGridView1.CurrentCell.Value ) == true)
k--;
else
k++;
indexDatagrid=dataGridView1.CurrentCell.RowIndex;
dataGridView1.ClearSelection();
dataGridView1.Refresh();

label1.Text = Convert.ToString(k);

}

درست کار میکنه ولی با یه اشکال: وقتی روی یک چک باکس کلیک میکنم برای بار اول برنامه متوجه میشه ولی اگه به طور پیوسته روی یک چک باکس کلیک کنم یا تیک رو بردارم برنامه متوجه نمیشه
مثل اینکه فوکوسی که گفتید سرش هست تا دستور "رفرش" و "clearselection" که آخر رویداد گذاشتم هم نتونست کمک کنه مجبور شدم اینو اضافه کنم
private void dataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
textBox1.Focus();
}
اگه راه حل بهتری دارید ممنون میشم راهنماییم کنید
با دو تادستور

maikola
شنبه 18 تیر 1390, 15:48 عصر
به نظرم دوستان کار خیلی سختش کردن

private int countDgv()
{
int tCdgv=0;
foreach (DataGridViewRow roww in dataGridView1.Rows)
{
if (bool.Parse(dataGridView1.Rows[roww.Index].Cells["NameColumn"].Value.ToString()))

tCdgv++;

}

return tCdgv;
}



الان تست کردم ولی همون مشکلی که اول داشتم باز هم وجود داره
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
label1.Text = Convert.ToString(countDgv());

}
private int countDgv()
{

int tCdgv = 0;

foreach (DataGridViewRow roww in dataGridView1.Rows)
{

if (Convert.ToBoolean(dataGridView1.Rows[roww.Index].Cells[4].Value))



tCdgv++;



}



return tCdgv;

}



پیشنهاد جناب مقدمی داره کار میکنه فقط اگه یه راه بهتر برای برداشتن فوکوس از روی دیتاگرید دارید ممنون میشم