PDA

View Full Version : سوال: استفاده از دو combobox در datagridview



ya30ien2
جمعه 22 اردیبهشت 1391, 11:44 صبح
سلام
دوستان من یک datagridview دارم که دوسلول اول رو با combobox پر کردم
حالا combobox اول رو با جدول پر کردم و میخوام combobox دوم با شرط نسبت به combobox اول پر بشه
تا اینجاش مشکلی نیست
من ردیف اول رو پر میکنم و وقتی میخوام به ردیف دوم برم ارور میده
منظورم از ردیف row هستش

اینم کد های من :

کد combobox 1:


void group()
{
//try
//{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Select name from Wgroup";
cmd.Connection = connect;
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter();
connect.Open();
da.SelectCommand = cmd;
da.Fill(dt);
connect.Close();
dgvch.DataSource = dt;
dgvch.DisplayMember = "name";
//}
//catch { }
}



کد combobox2:


void ware()
{
//try
//{
connect.Open();
SqlCommand cmd = new SqlCommand();
string strcmd = "Select name from Ware where gware='{0}'";
strcmd = string.Format(strcmd, DGV.CurrentRow.Cells[0].Value);
cmd.CommandText = strcmd;
cmd.Connection = connect;
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(dt);
connect.Close();
dgvch2.DataSource = dt;
dgvch2.DisplayMember = "name";
//}
//catch { }
}

اینم کد برای فراخوانی کد combobox2:


private void DGV_SelectionChanged(object sender, EventArgs e)
{
ware();
}

Mahmoud.Afrad
جمعه 22 اردیبهشت 1391, 13:53 عصر
خطا که مال اینه:

DGV.CurrentRow.Cells[0].Value
چون هنوز مقداری داخل این سلول نیست خطا میده. میتونید چک کنید اگر خالی بود متد ware() اجرا نشه. بهتره از رویداد cellenter استفاده کنید تا وقتی وارد سلول مربوط به کمبو دوم شد این متد اجرا بشه.


اما یک مشکل دیگه که به نظر من برای شما پیش خواهد آمد اینه که با تغییر کمبوباکس دومی چون این کمبو برای کل ستون هست پس برای همه سلول های این ستون مقادیر کمبو تغییر میکنه یعنی اگر در سطر دوم آیتمهای کمبو رو تغییر بدید برای بقیه سطر ها هم تغییر خواهد کرد .امتحان کنید متوجه خواهید شد.

ya30ien2
جمعه 22 اردیبهشت 1391, 14:34 عصر
شما درست میگید به هیچ وجه اجازه نمیده به سطر دوم برم
ارور میده
شما راه حلی ندارید؟

Mahmoud.Afrad
جمعه 22 اردیبهشت 1391, 14:52 عصر
خوب گفتم که "بهتره از رویداد cellenter استفاده کنید تا وقتی وارد سلول مربوط به کمبو دوم شدید این متد اجرا بشه." در رویداد cellenter جک کنید اگر سلول همان سلول کمبوباکس دوم بود وDGV.CurrentRow.Cells[0].Value خالی نبود اونوقت ware() اجرا بشه. (رویداد رو عوض کنید)

ya30ien2
جمعه 22 اردیبهشت 1391, 15:00 عصر
دوست عزیز من اینجوری نوشتم اما بعد از انتخاب comboboxاول در سطر دوم وقتی روی combobox دوم کلیک میکنم بازم ارور میده میشه بیشتر منو راهنمایی کنید
int i = 0;
if (DGV.CurrentRow.Cells[0].Value !=null && DGV.SelectedRows.Count==i)
{
ware();
i++;
}
بازم ممنون

ya30ien2
جمعه 22 اردیبهشت 1391, 15:01 عصر
راستی من داخل رویداد cellenter این کدها رو مینویسم

ya30ien2
جمعه 22 اردیبهشت 1391, 15:08 عصر
مشکل رو پیدا کردم بخاطر اینکه i رو داخل رویداد تعریف کرده بودم

حالا به یک مشکل بزرگتر برخورد کردم
هرچی داخل سطر اول انتخاب کردم که ستون دوم پر بشه
مابقی سطر ها هم ستونشون با همون محتویات سطر اول ستون دوم پر میشه

ya30ien2
شنبه 23 اردیبهشت 1391, 00:58 صبح
کسی نیست به من کمک کنه

ya30ien2
شنبه 23 اردیبهشت 1391, 10:42 صبح
دوست عزیز شرمنده من متوجه نشدم میشه بیشتر توضیح بدید
البته من از همون اول دو ستون جدا از هم از combobox تعریف کردم و به datagridview نسبت داده بودم
DataGridViewComboBoxColumn dgvch = new DataGridViewComboBoxColumn();
DataGridViewComboBoxColumn dgvch2 = new DataGridViewComboBoxColumn();

DGV.Columns.Add(dgvch);
DGV.Columns.Add(dgvch2);

اگه این کار من اشتباه بوده لطفا منو راهنمایی کنید
بازم ممنون

کد مقدار دهی رو هم همون سطر اول رو هر کاری کردم ارور میداد

ya30ien2
شنبه 23 اردیبهشت 1391, 11:38 صبح
یه چیز دیگه چون من کل ستون هام رو با کد نویسی تولید کردم نتونستم از DataGridViewComboBoxCell استفاده کنم
من خودم قبلا اینو نوشته بودم DataGridViewComboBoxColumn

ya30ien2
شنبه 23 اردیبهشت 1391, 12:29 عصر
اگه درست انجام داده باشم شما گفتید این کار رو انجام بدم

connect.Open();
SqlCommand cmd = new SqlCommand();
string strcmd = "Select name from Ware where gware='{0}'";
strcmd = string.Format(strcmd,DGV.CurrentRow.Cells[1].Value);
cmd.CommandText = strcmd;
cmd.Connection = connect;
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(dt);
connect.Close();
dgvcmbcell.DataSource = dt;
dgvcmbcell.DisplayMember = "name";
DGV.CurrentRow.Cells[2].DataGridView.Columns[2].CellTemplate = dgvcmbcell;
dgvcmbcell.Dispose();

اما این بار ستون بعدی رو خالی نشون میده یعنی هیچ چیزی اضافه نمیشه

Mahmoud.Afrad
شنبه 23 اردیبهشت 1391, 13:54 عصر
اگر dgvcmbcell رو به صورت سراسری تعریف کردید dgvcmbcell.Dispose(); رو حذف کنید.

برای چند سطر انجام بدید ببینید چی میشه.

ya30ien2
شنبه 23 اردیبهشت 1391, 14:24 عصر
هر کاری کردم ستون بعدی رو خالی نشون میده
راه حل دیگه ای به ذهنتون نمیرسه
بازم ممنون که به سوالات من جواب میدید
حقیقتش من دارم برای درس پروژه فوق دیپلمم یک پروژه مینویسم و میخوام اطلاعات خرید و فروش یک فروشگاه رو ثبت کنم که به این احتیاج دارم
ممنون میشم این مساله رو برام حل کنید

ya30ien2
شنبه 23 اردیبهشت 1391, 15:55 عصر
مشکل حل شد
فقط وقتی میخوام به سلول بعد برم combobox دوم خالی میشه
اینو چطوری برطرف کنم

ya30ien2
شنبه 23 اردیبهشت 1391, 17:58 عصر
با عرض پوزش رویداد رو اشتباه نوشته بودم
حالا بازم ردیف اول مشکلی نیست
ردیف دوم ستون اول رو که انتخاب کردم به ستون دوم میرم این ارور رو میده
86981

Mahmoud.Afrad
شنبه 23 اردیبهشت 1391, 18:06 عصر
برای من هم خطا رو میده. جالبه که فقط برای سطر دوم این پیغام رو میده. فعلا ببینم چطور میشه رفعش کرد.

ya30ien2
شنبه 23 اردیبهشت 1391, 21:55 عصر
دوست عزیز داخل این رویداد ستون دوم هیچ چیزی نشون نمیده؟

Mahmoud.Afrad
یک شنبه 24 اردیبهشت 1391, 02:48 صبح
فرم لود رو به این صورت اصلاح کنید. از رویداد cellbeginedit اتفاده کردم با try , catch که cacth فاقد پیغام هشداره. اگر اشتباه نکنم تابع ware رو ماله این کار گذاشتید:


private void Buy_Load(object sender, EventArgs e)
{
client();
DGV.Columns.Add("0", "ردیف");
DGV.Columns.Add(dgvch);
DGV.Columns[1].Name = "groupware";
DGV.Columns[1].HeaderText = "گروه کالا";

DGV.Columns.Add(dgvch2);
DGV.Columns[2].Name = "nameware";
DGV.Columns[2].HeaderText = "نام کالا";

DGV.Columns.Add("Number", "تعداد");
DGV.Columns.Add("Money", "قیمت (ریال)");
DGV.Columns.Add("Comment", "توضیحات");

DGV.Columns[0].Width = 30;
DGV.Columns[1].Width = 150;
DGV.Columns[2].Width = 150;
DGV.Columns[3].Width = 120;
DGV.Columns[4].Width = 150;
DGV.Columns[5].Width = 200;
group();
}

private void DGV_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
ware();
}

void ware()
{
try
{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Select name from Ware where gware='" + DGV.CurrentRow.Cells["groupware"].Value + "'";
DataGridViewComboBoxCell dgvcmbcell = new DataGridViewComboBoxCell();
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd.CommandText, connect);
da.Fill(dt);
dgvcmbcell.DataSource = dt;
dgvcmbcell.DisplayMember = "name";
DGV.CurrentRow.Cells[2] = dgvcmbcell;
dgvcmbcell.Dispose();
da.Dispose();
cmd.Dispose();
}
catch
{ }
}

ya30ien2
یک شنبه 24 اردیبهشت 1391, 03:03 صبح
ممنون از لطفی که کردی و مشکل رو حل کردی