PDA

View Full Version : مبتدی: گرفتن مقدار توسط SelectedValue در ComboBx-



اوبالیت به بو
چهارشنبه 12 بهمن 1390, 09:24 صبح
درود

بنده یک ComboBox رو بوسیله DataTable پر می کنم. DisplayMember من نام کالا و ValueMember من کد کالاست. حالا من به کد کالا بر اساس انتخاب هایی که کاربر انجام می ده اجتیاج دارم زیرا باید یک Select بر اساس کد کالا رو اجرا کنم.

مساله اینجاست که من نمی تونم این مقدار ذخیره شده در قسمت Value کنترل رو به int تبدیل کنم. کدهایی که استفاده کردم و جواب نگرفتم:


int pID = int.Parse(cmbProducts.SelectedValue.ToString());
int pID = Convert.ToInt32(cmbProducts.SelectedValue.ToString ());
int pID = (int)(cmbProducts.SelectedValue.ToString());


به نظر شما مشکل از کجا می تونه باشه؟ من چه کار دیگه ای باید انجام بدم؟

mmd2009
چهارشنبه 12 بهمن 1390, 09:51 صبح
با سلام

دقیقا با چه خطایی رو به رو میشی ؟!

pesar irooni
چهارشنبه 12 بهمن 1390, 10:31 صبح
داری کار درستی انجام میدی! قاعدتاً باید جواب بده. مگر اینکه SelectedValue ات قابل تبدیل به int نباشه. پیشنهاد میکنم selectedValue رو تو یه messegebox نشون بدی ببینی چی بر میگردونه. پیغام خطایی هم که میگیری همونطور که دوستمون گفت میتونه کمک کنه.

اوبالیت به بو
چهارشنبه 12 بهمن 1390, 10:43 صبح
درود

پیغام خطا:

Input string was not in a correct format.و متدی که در Form_Load فراخوانی میشه جهت نمایش داده ها به این صورت هست:

private void ShowAllProducts()
{
DataSet dsProducts = new DataSet();

dsProducts = Matab.DAL.Classes.Products.SelectAll();

if (dsProducts.Tables[0].Rows.Count > 0)
{
cmbProducts.DataSource = dsProducts.Tables[0];
cmbProducts.DisplayMember = "Name";
cmbProducts.ValueMember = "ID";
}
else
{
cmbProducts.Items.Add("هیچ محصولی در سیستم ثبت نشده است.");
btnSave.Enabled = false;
}
}


کاملا ذهنم مشغول این موضوع شده. من در رویداد SelectedIndexChange یه همچین کدی دارم:

private void cmbProducts_SelectedIndexChanged(object sender, EventArgs e)
{
int pID = Convert.ToInt32(cmbProducts.SelectedValue.ToString ());
lblPrice.Text = GetPrice(pID).ToString();
lblSum.Text = Sum(Convert.ToInt32(lblPrice.Text), Convert.ToInt32(txtQuantity.Text), float.Parse(txtDiscount.Text)).ToString();
}

lblPrice: یک برچسب هست که قیمت واحد اون کالا رو نشون می ده. یعنی همزمان که کاربر از لیست مربوطه گزینه ای رو انتخاب می کنه توسط متد GetPrice یک Select سریع زده میشه و قیمت اون کالا خاص در lblPrice نشون داده میشه.
lblSum: در این جا یک متد دیگه دارم به اسم Sum که میاد قیمت نهایی رو در lblSum نشون می ده. (قیمت کل * تعداد - درصد تخفیف).

مساله اینجاست که من باید هربار که کاربر کالایی رو انتخاب می کنه توسط متد GetPrice وصل بشم به DB و قیمت واحد اون رو بخونم. به همین دلیل یک StoredProcedre دارم که کد کالا (کلید اصلی) دریافت می کنه و یک Select می زنه و قیمت رو نشون می ده. حالا این کد کالا در بخش ValueMember کنترل ComboBox من ذخیره شده و به اون احتیاج دارم.

AliSaeedi_v
چهارشنبه 12 بهمن 1390, 11:16 صبح
سلام از این متد استفاده کن و امتحان کن:
int32.parse(combo.selecteditem.tostring())

اوبالیت به بو
چهارشنبه 12 بهمن 1390, 12:01 عصر
سلام از این متد استفاده کن و امتحان کن:
int32.parse(combo.selecteditem.tostring())


متاسفانه این دستور کار نمی کنه. خروجی صحیحی به من نمی ده

AliSaeedi_v
چهارشنبه 12 بهمن 1390, 12:11 عصر
من توی برنامم ازین استفاده میکنم جواب میده.
int id=Int32.Parse(Combo.SelectedValue.ToString())

اوبالیت به بو
چهارشنبه 12 بهمن 1390, 12:15 عصر
مساله رو پیدا کردم اما چی جوری باید حل کنم:

من داخل FormLoad متد ShowAllProduct رو که در پست دومم گذاشتم صدا می زنم. اما قبل اینکه کار اون متد تموم بشه وارد رویداد SelectedIndexChange میشه. یعنی خود به خود این اتفاق می افته و چون در اون رویداد من گفتم که SelectedValue رو به من برگردون و چون هنوز هیچ Boundی صورت نگرفته پیغام خطا صادر میشه.

حالا این مساله رو چی جوری میشه حل کرد؟ یعنی اول Bound صورت بگیره و هر وقت که SelectedIndexChange رخ داد اون موقع دستورات داخل رویدادش اجرا بشن

AliSaeedi_v
چهارشنبه 12 بهمن 1390, 12:34 عصر
ببین من توی تابع بایند نمیکنم.خروجی تابع رو ازنوع دیتا تیبل قرار بده.و توی فرم لود دیتاسورس کامبو رو برابر این تابع قرار بده.مثلا

توی فرم لود
Cbgroup.DisplayMember = "gname";
Cbgroup.ValueMember= "gid";
Cbgroup.DataSource = gr.getall();

توی سلکتید ایندکس
customer c=new customer();
dataGridView1.DataSource = c.getbygroup(Int32.Parse(Cbgroup.SelectedValue.ToS tring()));

customerکلاسی هست که مربوط به اطلاعات مشتریان است

اوبالیت به بو
چهارشنبه 12 بهمن 1390, 12:36 عصر
ببین من توی تابع بایند نمیکنم.خروجی تابع رو ازنوع دیتا تیبل قرار بده.و توی فرم لود دیتاسورس کامبو رو برابر این تابع قرار بده.مثلا
[CSHARP]
توی فرم لود
Cbgroup.DisplayMember = "gname";
Cbgroup.ValueMember= "gid";
Cbgroup.DataSource = gr.getall();



من فکر نمی کنم فرقی بکنه. چون بالاخره همون عملیات داره انجام میشه. حالا تابع خروجی بده یا داخل خودش این کارو انجام بده فرقی نمی کنه.

amir3321
چهارشنبه 12 بهمن 1390, 12:46 عصر
خوب تومیتونی در هنگام لود رویداد selectedindexchane رو غیر فعال کنی و بعد از عمل لود اونو دوباره فعال کنی مثل کد زیر

this.ComboBox1.SelectedIndexChanged -= new System.EventHandler(ComboBox1_SelectedIndexChanged );



this.ComboBox1.SelectedIndexChanged += new System.EventHandler(ComboBox1_SelectedIndexChanged );

اوبالیت به بو
چهارشنبه 12 بهمن 1390, 14:35 عصر
مشکل رو یک طور دیگه حل کردم (حل نشده باقی ماند) و اون اینکه اول یک عملیات دیگه ای انجام میشه و بعد از اون ShowAllProducts فراخوانی میشه.

immortal1990
چهارشنبه 12 بهمن 1390, 14:59 عصر
خب مهندس توضیح بده دقیقا منم مشکل شمارو دارم با این تفاوت که که مقدارایی که بهم بر میگردونه خود مثلا کد محصول نیست که برمیگردونه مقدار موقعیت رشته انتخاب شده مثلا xyzدرون Combobox من باشه 7 ولی کد محصول 1002است چیزی که برمیگردونه 7 نه 1002

اوبالیت به بو
چهارشنبه 12 بهمن 1390, 15:06 عصر
خب مهندس توضیح بده دقیقا منم مشکل شمارو دارم با این تفاوت که که مقدارایی که بهم بر میگردونه خود مثلا کد محصول نیست که برمیگردونه مقدار موقعیت رشته انتخاب شده مثلا xyzدرون Combobox من باشه 7 ولی کد محصول 1002است چیزی که برمیگردونه 7 نه 1002
درود

متوجه نشدم...

immortal1990
چهارشنبه 12 بهمن 1390, 15:25 عصر
الان تو یه تاپیک جدید توضیح دادم کامل