PDA

View Full Version : دریافت مقدار چند Value از کمبو باکس



mkmostafa
دوشنبه 10 آبان 1400, 13:49 عصر
سلام
کمبوباکس توسط جدول زیر پر میشه :
153567

کد پرشدن کمبوباکس :
comboBoxKala.DataSource = _db.comboBoxKala_Select();
comboBoxKala.DisplayMember = "plus";
comboBoxKala.ValueMember = "KalaId";

حالا میخوام هر وقت کاربر یکی از ایتم های کمبوباکس رو انتخاب کنه مقادیر ستون pis و Price_Sales در مقادیری ریخته بشه؟؟؟
مثلا کاربر زردچوبه رو انتخاب می کنه و باید مقادیر 32 و 14000 در متغیری ریخته بشه که هدفم هم این هست که موجودی و قیمت فروش همان لحظه به کاربر در تکس باکسی نمایش
داده بشه

خیلی ممنون راهنمایی بفرمایید

Hossis
سه شنبه 18 آبان 1400, 21:32 عصر
این مشکل فقط یک راه داره
و اونم اینه که از کامبوباکس DevComponent استفاده کنید که هر آیتم، یک کلید و یک مقدار (نام و تکست و تگ و تولتیپ داره و هریک از این مقادیر رو می تونید به یکی از ستون های جدول اختصاص بدید)

group45
شنبه 22 آبان 1400, 07:46 صبح
سلام
شما ار datagridview استفاده کن

mkmostafa
شنبه 27 آذر 1400, 14:32 عصر
چند سال پیش از این روش استفاده کرده بودم ولی الان یادم رفته
نیازی هم به دیتاگریدویو نیست.
کمبوباکس رو اسپلیت میکرد و مثلا split1 داخلش مقدار صفر ستون کمبوباکس بریزه ، برای split2 مقدار یک ستون کمبوباکس رو بریزه و همینجوری به ازای هر ستون در کمبوباکس یک split میزاشتم
حالا اگر مهندسان عزیز ، کد کاملش رو برام بزارن ، ممنون میشم

mazoolagh
سه شنبه 30 آذر 1400, 09:42 صبح
این مشکل فقط یک راه داره
و اونم اینه که از کامبوباکس DevComponent استفاده کنید که هر آیتم، یک کلید و یک مقدار (نام و تکست و تگ و تولتیپ داره و هریک از این مقادیر رو می تونید به یکی از ستون های جدول اختصاص بدید)

البته اگر قرار به استفاده از کمپوننت های devex باشه کنترل های lookupedit (grid یا search) بمراتب انتخاب های بهتری هستن.

mazoolagh
سه شنبه 30 آذر 1400, 09:50 صبح
چند سال پیش از این روش استفاده کرده بودم ولی الان یادم رفته
نیازی هم به دیتاگریدویو نیست.
کمبوباکس رو اسپلیت میکرد و مثلا split1 داخلش مقدار صفر ستون کمبوباکس بریزه ، برای split2 مقدار یک ستون کمبوباکس رو بریزه و همینجوری به ازای هر ستون در کمبوباکس یک split میزاشتم
حالا اگر مهندسان عزیز ، کد کاملش رو برام بزارن ، ممنون میشم

1- شما میتونین کمبوباکس رو به همون روش معمولی استفاده کنین و بعد در رخداد selectedindexchanged یا selectedvaluechanged بر اساس value از همون دیتاتیبل که کمبو رو پر کردین هر مقداری که لازم دارین بخونین.
2- اون مورد split که اشاره کردین:
میتونین value member رو بجای kalaid با join ستونهای مورد نیاز پر کنین (جدا کننده فیلدها باید کارآکتری باشه که مطمئن هستین در هیچ فیلدی ظاهر نمیشه)
بعد در همین رخدادهایی که گفته شد value رو split کنین.

mkmostafa
جمعه 03 دی 1400, 18:13 عصر
احسنت! من هم همین رو میخوام.
کدش رو میتونید برام بزارید.
یک مثال در مورد کمبوباکس بزارید
خیلی ممنون ، مهندس عزیز.

mazoolagh
شنبه 04 دی 1400, 11:32 صبح
فرض کنیم دیتاتیبل comboBoxKala_Select یک ستون به اسم col_details داشته باشه که از join شدن فیلدهای kalaid و pis و price_sales با یک کارآکتر مشخص (مثلا @) ساخته شده.
فعلا به این که این ستون چجوری ساخته میشه کاری نداریم و اول کد بخش استخراج اطلاعات از اون رو تکمیل میکنیم.

در رخداد form load :
comboBoxKala.DataSource = _db.comboBoxKala_Select();
comboBoxKala.DisplayMember = "plus";
comboBoxKala.ValueMember = "col_details";

در رخداد selectedindexchanged کمبو comboBoxKala :
if (comboBoxKala.selectedvalue == null) return;
string[] a;
a=comboBoxKala.selectedvalue.tostring().split('@') ;

حالا در a[0] مقدار kalaid ، در a[1] مقدار pis و در a[2] مقدار price_sales رو داریم.

البته وقتی با کد کمبوباکس رو bind میکنیم بهتر هست از رخداد selectionchangecommitted استفاده کنیم.

حالا روش ساخت فیلد col_details رو بررسی میکنیم.

یک راه این هست که در دستور select کوئری اون رو بیاریم:
SELECT kalaid , plus , pis , price_sales , kalaid + '@' + pis + '@' + price_sales AS col_details FROM ...

برای سادگی و رساندن مطلب فرض کردیم هر سه فیلد از نوع nvarchar هست، در عمل هر فیلد غیر این رو باید با تابع CAST تبدیل کنیم:
SELECT kalaid , plus , pis , price_sales , CAST(kalaid AS nvarchar(10)) + '@' + pis + '@' + price_sales AS col_details FROM ...

راه دیگه این هست که فیلد col_details رو به صورت یک فیلد calculated با کد بسازیم و به جدول اضافه کنیم:
comboBoxKala_Select.columns.add(new datacolumn("col_details" , typeof(system.string) , "kalaid + '@' + pis + '@' + price_sales"));

البته اینها که گفته شد فقط بخاطر تکمیل بحث و خواسته استارتر محترم تاپیک بود، ولی در عمل نیازی به هیچ کدام از این ها نیست.
کافی هست valuemember رو همون kalaid بگذاریم و خیلی ساده مستقیما از روی datasource کمبوباکس و بر مبنای selectedvalue با یک select به datarow مورد نظر و دیتای اون برسیم:
datarow dr = comboBoxKala_Select.select("kalaid=" + comboBoxKala.selectedvalue.tostring())[0];

mkmostafa
چهارشنبه 15 دی 1400, 19:45 عصر
سلام مهندسان عزیز
همه موارد رو امتحان کردم و حتی تغییراتی هم دادم ولی اصلا درست نشد
فقط خطا میداد
مشکل حل نشد

mehran6764
جمعه 17 دی 1400, 23:00 عصر
شاید این روش که میگم بهینه نباشه اما کار راه انداز هست ، من بودم یه لیست یا حتی combobox زمان اجرا می ساختم ، نتایج کوئری فرضا plus رو به این لیست یا کامبوباکس اضافه می کردم
بعدش از هم از طریق اندیس ها به مقادیر دسترسی داشتم مثلا می دونیم اندیس دوم PIS=32 هست و PLUS = زرد چوبه

Mahmoud.Afrad
شنبه 18 دی 1400, 08:06 صبح
ستون قیمت را هم سلکت کنید و مثلا توی selecteditemchanged آیتم انتخابی را به نوع اصلی cast کنید و و از داده هاش استفاده کنید.

یا از بایندینگ استفاده کنید که ساده تر هست.

mazoolagh
شنبه 18 دی 1400, 10:37 صبح
سلام مهندسان عزیز
همه موارد رو امتحان کردم و حتی تغییراتی هم دادم ولی اصلا درست نشد
فقط خطا میداد
مشکل حل نشد

اون کدهایی که در پست شماره 8 گذاشتم (مربوط به 3 روشی که توضیح دادم) شاید مشکل syntax داشته باشه، ولی قطعا مشکل منطق نداره.

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

بجاش من یک نمونه بر اساس همون مطالب پست 8 میسازم و اینجا پیوست میکنم.

mazoolagh
شنبه 18 دی 1400, 12:47 عصر
دیتا نمونه از دیتابیس northwind گرفته شده:
SELECT Products.ProductID,
Products.ProductName,
Categories.CategoryName,
Products.QuantityPerUnit,
Products.UnitPrice,
Products.UnitsInStock,
CAST(Products.QuantityPerUnit AS nvarchar(50))
+ '@' + CAST(Products.UnitPrice AS nvarchar(50))
+ '@' + CAST(Products.UnitsInStock AS nvarchar(50)) AS JoinedInQuery
FROM Products INNER JOIN
Categories ON Products.CategoryID = Categories.CategoryID
ORDER BY Products.ProductID

153649

153650

mazoolagh
شنبه 18 دی 1400, 12:52 عصر
private void Calculated_Field_In_Select_Query_Load(object sender, EventArgs e)
{
NwindDataSet ds = new NwindDataSet();
NwindDataSetTableAdapters.ProductsTableAdapter ta = new NwindDataSetTableAdapters.ProductsTableAdapter() ;
ta.Fill(ds.Products);


CB_Product.DataSource = ds.Products;
CB_Product.ValueMember = "JoinedInQuery";
CB_Product.DisplayMember = "ProductName";
CB_Product.SelectedIndex = -1;

DGV_Products.DataSource = ds.Products;
}

private void CB_Product_SelectionChangeCommitted(object sender, EventArgs e)
{
string[] a;
a = CB_Product.SelectedValue.ToString().Split('@');
TB_QuantityPerUnit.Text = a[0];
TB_UnitPrice.Text = a[1];
TB_UnitsInStock.Text = a[2];
}

153651

mazoolagh
شنبه 18 دی 1400, 12:57 عصر
private void Calculated_Field_In_Datatable_Load(object sender, EventArgs e)
{
NwindDataSet ds = new NwindDataSet();
NwindDataSetTableAdapters.ProductsTableAdapter ta = new NwindDataSetTableAdapters.ProductsTableAdapter();
ta.Fill(ds.Products);
ds.Products.Columns.Add(new DataColumn("CalculatedJoin", typeof(System.String), "QuantityPerUnit + '@' + UnitPrice + '@' + UnitsInStock"));

CB_Product.DataSource = ds.Products;
CB_Product.ValueMember = "CalculatedJoin";
CB_Product.DisplayMember = "ProductName";
CB_Product.SelectedIndex = -1;

DGV_Products.DataSource = ds.Products;
}


private void CB_Product_SelectionChangeCommitted(object sender, EventArgs e)
{
string[] a;
a = CB_Product.SelectedValue.ToString().Split('@');
TB_QuantityPerUnit.Text = a[0];
TB_UnitPrice.Text = a[1];
TB_UnitsInStock.Text = a[2];
}

153652

mazoolagh
شنبه 18 دی 1400, 13:00 عصر
private void Read_Values_From_Datatable_Load(object sender, EventArgs e)
{
NwindDataSetTableAdapters.ProductsTableAdapter ta = new NwindDataSetTableAdapters.ProductsTableAdapter();
ta.Fill(ds.Products);

CB_Product.DataSource = ds.Products;
CB_Product.ValueMember = "ProductId";
CB_Product.DisplayMember = "ProductName";
CB_Product.SelectedIndex = -1;

DGV_Products.DataSource = ds.Products;
}


private void CB_Product_SelectionChangeCommitted(object sender, EventArgs e)
{
DataRow dr = ds.Products.Select("productID=" + CB_Product.SelectedValue.ToString())[0];
TB_QuantityPerUnit.Text = dr["QuantityPerUnit"].ToString();
TB_UnitPrice.Text = dr["UnitPrice"].ToString();
TB_UnitsInStock.Text = dr["UnitsInStock"].ToString();
}

153653