سوال

نمایش دو لیست(ستون) در یک ComboBox در سی شارپ

بازدید643پست ها2آخرین فعالیت2 سال پیش
2
3

سلام

من میخوام توی یک کمبوباکس از یک کوئری که دوتا ستون یکی نام و یکی کد برام برمیگردونه رو همزمان در یک کمبوباکس نشون بدم مثل عکس زیر

اما وقتی کاربر یکی از آیتمن های این لیست کمبوباکس رو انتخاب کرد نهایتا چیزی که توی کمبوباکس نشون داده میشه یه کد هستش یعنی بعد از کلیک روی یکی از آیتم های Selected Item برابر رو همون کد نشون داده بشه

توضیح تصویر
مدل داده ای :

    public partial class CST
{
    public string Tafcode { get; set; }//ID
    public string Esm { get; set; }//Name

    public string Shoy => $"{Tafcode}  {Esm}";
}

کد سی شارپ :

 var quer_ITM = dbms.Database.SqlQuery<CST>("SELECT Tafcode , Esm FROM CST").ToList();

        cmb.ItemsSource = quer_ITM;
        cmb.DisplayMemberPath = "Shoy"; //Merg of Esm + Tafcode
        cmb.SelectedValuePath = "Tafcode";//The Primary Key 112-1-1

XAML :

<ComboBox x:Name="cmb"  Margin="0,312,202,0" VerticalAlignment="Top" Height="22" FlowDirection="RightToLeft"  FontFamily="/Negin;component/NT/#IRANSans" IsEditable="True" Background="#FFCCFFFF" HorizontalAlignment="Right" Width="402">
       
    </ComboBox>

چطور این کار رو انجام بدم ؟

سلام متدی که بنده نوشتم حتی اگر داده های نامرتبی هم به عنوان گزینه وارد ComboBox کنید ، باز هم کار می کنه و مستقل از پایگاه داده است و نیز قابل حمل تر است. – رضا جافری 2 سال پیش

2 پاسخ

1

سلام
فرض می کنیم شما گزینه ها رو از پایگاه داده به ComboBox اضافه کردید.
خروجی برنامه: http://www.upsara.com/images/d413457_.gif
ابتدا یک رویداد DropDownClosed برای ComboBox ایجاد می کنید سپس کد زیر رو در این رویداد اضافه می کنید:

            string CMBText = null;
            switch (cmb.SelectedItem)
            {
                case null:
                    break;
                default:
                    foreach (char CB in cmb.SelectedItem.ToString())
                    {
                        switch (char.IsDigit(CB) || CB.ToString().Contains('-'))
                        {
                            case false:
                                break;
                            default:
                                CMBText += CB;
                                break;
                        }
                    }
                    cmb.Text = CMBText;
                    break;
            }

در خطی که char.IsDigit(CB) || CB.ToString().Contains('-') نوشته شده شما می تونید به دلخواه خودتون هر کارکتری که مشخص می کنید نمایش داده بشه ، برای نمونه شما می تونید به جای '-' از کارکتر '+' استفاده کنید یا اینکه یک || دیگه قرار بدید و CB.ToString().Contains('+') رو اضافه کنید.

توجه: اگر مشکل شما رفع شد ، پاسخ بنده رو به عنوان راه حل انتخاب کنید و رای بدید تا در سوالات دیگه کمک رسان باشم با تشکر

آخرین ویرایش: 13-08-2021 ???? 05:21، توسط رضا جافری
اگر کاربر بخواد کد شما رو در ComboBox دیگری استفاده کنه در صورتی که ستون پایگاه داده تغییر کنه اونوقت کد شما قابل اطمینان نیست – رضا جافری 2 سال پیش
خب تاریخ هم چرا باید عوض بشه؟یا - یا / یا : – رضا جافری 2 سال پیش
در ضمن شما که بلد بودید چرا زودتر جواب ندادید ، مطلب بعدی اینکه الگوریتم و سادگی کد یک مطلب است ، کارایی و سرعت برنامه مطلبی دیگر چون کاربر با اون سر کار داره و اینکه در فریم ورک NET. با یک آزمایش ساده می توان سرعت if , switch رو مقایسه کرد. – رضا جافری 2 سال پیش
من رو پروژه ای کار می کنم ، که اول از دستورات if کمک می گرفتم اما الان کل پروژه رو با switch دارم می نویسم شاید پیچیده تر باشه اما خروجی نهایی برای کاربرم خیلی مهمتر از درگیر شدنم است – رضا جافری 2 سال پیش
این صحبت شماست "کی گفته switch سرعت برنامه رو بالا میبره وقتی اصلا جواب سوال با این دستور نیست؟" وقتی برنامه نویسان توابع آماده رو فراخوانی می کنند زمان بیشتری نیاز است در نتیجه اگر بتوانند الگوریتمی خودشون پیاده سازی کنند سرعت برنامه بالاتر می ره – رضا جافری 2 سال پیش
1

درود
باید در پاسخ خدمتتون عرض کنم که پاسخ سوال شما فقط چند خط کد هست که در پایان ذکر شده اما مدل داده ای شما یه چنتا اشکال کوچیک داره برای معرفی شیء CST.
من اول مدل داده ای رو اصلاح میکنم.

public partial class CST
        {
            private string tafcode;
            private string esm;

            public CST(string tafcode, string esm)
            {
                this.tafcode = tafcode;
                this.esm = esm;
            }
            public string Tafcode
            {
                get { return tafcode; }
                set { tafcode = value; }
            }
            public string Esm
            {
                get { return esm; }
                set { esm = value; }
            }
            public string Shoy
            {
                get { return tafcode + "  " + esm; }
            }
        }

خب شما برای پر کردن Combobox یا Dropdown از لیست جنریک استفاده کردید که من هم با توجه به مدل داده ای که تعریف کردم با استفاده از جنریک لیستها در رویداد Form1_Load داده های Combobox رو پر میکنم: (هیچ فرقی نمیکنه که از Query برای پرکردن استفاده کنید یا از Generic List ، مهم خصوصیت DisplayMember هست)

List<CST> CSTList = new List<CST>();

CSTList.Add(new CST("1400-05-21", "صبح"));
CSTList.Add(new CST("1400-05-17", "ظهر"));
CSTList.Add(new CST("1400-05-15", "شب"));

cmb.DataSource = CSTList;
cmb.DisplayMember = "Tafcode"; 
cmb.ValueMember = "Tafcode";

خب حالا فقط کافیه برای نمایش Esm و Tafcode هنگام باز شدن Dropdown داخل رویداد cmb_DropDown مقدار DisplayMember رو برابر Shoy (ترکیب Tafcode و Esm) قرار بدیم:

private void cmb_DropDown(object sender, EventArgs e)
        {
            cmb.DisplayMember = "Shoy";
        }

حالا برای برگردوندن هنگام بسته شدن Dropdown به همون حالت قبل، مقدار DisplayMember در رویداد cmb_DropDownClosed رو فقط Tafcode مینویسیم فقط چون با تغییر DisplayMember گزینه انتخاب شده دوباره به صورت پیش فرض روی اولین آیتم قرار میگیره (اندیس صفر) قبل از مشخص کردن DisplayMember اندیس انتخاب شده رو داخل یک متغیر نگهداری میکنیم و بعد از مشخص کردن DisplayMember دوباره اون مقدار رو داخل اندیس انتخاب شده قرار میدیم:

private void cmb_DropDownClosed(object sender, EventArgs e)
        {
            int index = cmb.SelectedIndex;
            cmb.DisplayMember = "Tafcode";
            cmb.SelectedIndex = index;
        }

پس شما برای پر کردن Combobox چه از SQL استفاده کنید چه از Object استفاده کنید چه از لیست جنریک استفاده کنید، فقط کافیه داخل رویداد cmb_DropDown (هنگامی که لیست کشویی باز می شود) و داخل رویداد cmb_DropDownClosed (هنگامی که لیست کشویی بسته می شود) مقدار DisplayMember رو تغییر بدین.

این هم خروجی برنامه:
https://s4.uupload.ir/files/test_qiec.gif

آخرین ویرایش: 13-08-2021 ???? 14:55، توسط عباس اختیاری
سلام شما این قسمت ( " در خطی که char.IsDigit(CB) || CB.ToString().Contains('-') نوشته شده شما می تونید به دلخواه خودتون هر کارکتری که مشخص می کنید نمایش داده بشه") رو خوندید؟ کد من مستقل از پایگاه داده است و کاربر به دلخواه خودش می تونه هر کارکتری رو که می خواد نمایش بده – رضا جافری 2 سال پیش
کد من ترکیبی از الگوریتم و یک الگو است که دست کاربر باز میزاره در فیلتر کردن TextBox ،ComboBox و ListBox مثلاً اگر بخواد کارکتر فاصله رو نمایش بده ، می تونه به اون خط یک || و CB.ToString().Contains(' ') رو اضافه کنه برای مابقی کارکترها هم همینطور. – رضا جافری 2 سال پیش

سوال برنامه نویسی دارید؟

ندونستن عیب نیست، نپرسیدن چرا!

این سوال حل نشده است!

این سوال هنوز حل نشده یا به پاسخ بهتری نیاز دارد. برای پاسخ به این سوال کافیست وارد حساب کاربری خود شوید.