سی شارپ-combo boxهای مرتبط

zcomolus

New Member
لطفا اگر کسی جواب سوالمو می دونه جواب بده.واقعا احتیاج دارم بهش.
طراحی و کدنویسی کمبو باکسهای مرتبط چطور انجام می شه.
منظور از کمبو باکسهای مرتبط اونهایی اند که با تغییر داده های (آیتم های) داخل یکی شون آیتم های داخل اون یکی اتوماتیک تغییر می کنه.
شبیه کمبو باکسهایی که توی فرمهای ثبت نام اینترنتی می بینیم:
استان:
شهر:
از بین محتویات کمبو باکس "استان" وقتی هر کدوم انتخاب می شن محتویات کمبو باکس "شهر" به شهرهای اون استان تغییر پیدا می کنن.
خیلی ممنونم.
 

the_king

مدیرکل انجمن
لطفا اگر کسی جواب سوالمو می دونه جواب بده.واقعا احتیاج دارم بهش.
طراحی و کدنویسی کمبو باکسهای مرتبط چطور انجام می شه.
منظور از کمبو باکسهای مرتبط اونهایی اند که با تغییر داده های (آیتم های) داخل یکی شون آیتم های داخل اون یکی اتوماتیک تغییر می کنه.
شبیه کمبو باکسهایی که توی فرمهای ثبت نام اینترنتی می بینیم:
استان:
شهر:
از بین محتویات کمبو باکس "استان" وقتی هر کدوم انتخاب می شن محتویات کمبو باکس "شهر" به شهرهای اون استان تغییر پیدا می کنن.
خیلی ممنونم.

یک پروژه جدید بسازید و دو تا ComboBox با نام های comboBox1 و comboBox2 روی فرم قرار دهید و کد زیر را درون
کد فرم قرار داده و اجرا کنید :

کد:
        private void [B]comboBox1_SelectedIndexChanged[/B](object sender, EventArgs e)
        {
            string[] items = { "" };
            switch (comboBox1.SelectedIndex)
            {
                case 0:
                    items = new string[] { "", "1", "2", "3", "4", "5" };
                    break;
                case 1:
                    items = new string[] { "", "A", "B", "C", "D", "E" };
                    break;
                case 2:
                    items = new string[] { "", "v", "y", "x", "y", "z" };
                    break;
            }
            comboBox2.Items.Clear();
            comboBox2.Items.AddRange (items);
            comboBox2.SelectedIndex = 0;
            comboBox2.Enabled = true;
        }

        private void [B]Form1_Load[/B](object sender, EventArgs e)
        {
            string[] items = {"From 1 To 5", "From A to E", "From v to z"};
            comboBox1.Items.AddRange(items);
            comboBox2.Enabled = false;
        }

کد رویداد Form1_Load محتویات comboBox1 را برابر سه گزینه "From 1 To 5" و "From A to E" و "From v to z" قرار می دهد.
کافیست که یکی از آنها را انتخاب کنید تا توسط کدهای رویداد comboBox1_SelectedIndexChanged، محتویات
comboBox2 بر اساس گزینه ای که در comboBox1 انتخاب کرده اید تغییر کند. این همان اتفاقی است که در صفحات اینترنتی
رخ می دهد. البته AddRange زمانی کاربرد دارد که بخواهید لیست گزینه ها را در یک لحظه یکجا قرار دهید.
اگر بخواهید روی هر گزینه درج شده جداگانه تصمیم گیری کنید، از Add بجای AddRange استفاده نمایید.
 

zcomolus

New Member
یک پروژه جدید بسازید و دو تا ComboBox با نام های comboBox1 و comboBox2 روی فرم قرار دهید و کد زیر را درون
کد فرم قرار داده و اجرا کنید :

کد:
        private void [B]comboBox1_SelectedIndexChanged[/B](object sender, EventArgs e)
        {
            string[] items = { "" };
            switch (comboBox1.SelectedIndex)
            {
                case 0:
                    items = new string[] { "", "1", "2", "3", "4", "5" };
                    break;
                case 1:
                    items = new string[] { "", "A", "B", "C", "D", "E" };
                    break;
                case 2:
                    items = new string[] { "", "v", "y", "x", "y", "z" };
                    break;
            }
            comboBox2.Items.Clear();
            comboBox2.Items.AddRange (items);
            comboBox2.SelectedIndex = 0;
            comboBox2.Enabled = true;
        }
 
        private void [B]Form1_Load[/B](object sender, EventArgs e)
        {
            string[] items = {"From 1 To 5", "From A to E", "From v to z"};
            comboBox1.Items.AddRange(items);
            comboBox2.Enabled = false;
        }

کد رویداد Form1_Load محتویات comboBox1 را برابر سه گزینه "From 1 To 5" و "From A to E" و "From v to z" قرار می دهد.
کافیست که یکی از آنها را انتخاب کنید تا توسط کدهای رویداد comboBox1_SelectedIndexChanged، محتویات
comboBox2 بر اساس گزینه ای که در comboBox1 انتخاب کرده اید تغییر کند. این همان اتفاقی است که در صفحات اینترنتی
رخ می دهد. البته AddRange زمانی کاربرد دارد که بخواهید لیست گزینه ها را در یک لحظه یکجا قرار دهید.
اگر بخواهید روی هر گزینه درج شده جداگانه تصمیم گیری کنید، از Add بجای AddRange استفاده نمایید.


متشکرم.ولی مثل اینکه من سوالم درست و کامل نبوده.
شرمنده؛اگه می شه لطف کنین بگین چطوری با اطلاعات توی دیتا بیس این کارو انجام بدم.
دو تا جدول دارم که ارتباط یک به چند دارن.
اون آیتمی که از کمبو باکس اولی انتخاب می شه محتویات مرتبط جدول دوم (که nتا هستن)رو توی کمبو باکس دوم نشون می ده.
من نمی تونم درست منظورم رو بگم:| اگه لطف کنین باز جوب بدین ممنون می شم.
 

the_king

مدیرکل انجمن
متشکرم.ولی مثل اینکه من سوالم درست و کامل نبوده.
شرمنده؛اگه می شه لطف کنین بگین چطوری با اطلاعات توی دیتا بیس این کارو انجام بدم.
دو تا جدول دارم که ارتباط یک به چند دارن.
اون آیتمی که از کمبو باکس اولی انتخاب می شه محتویات مرتبط جدول دوم (که nتا هستن)رو توی کمبو باکس دوم نشون می ده.
من نمی تونم درست منظورم رو بگم:| اگه لطف کنین باز جوب بدین ممنون می شم.

فرض کنیم که دو ComboBox داشته باشیم که بایستی در یکی مدل محصول و در دیگری رنگ محصول انتخاب شود.
پس دو Table خواهیم داشت، در یکی لیست مدل های محصولات ثبت می شود، و در دیگری لیست رنگهایی که هر محصول
دارد. بایستی لیست رنگ ها بر اساس مدل انتخاب شده تغییر کند. در واقع بین دو Table یک ارتباط وجود دارد.

به عنوان مثال یک دیتابیس را با Microsoft Access ایجاد کردم که دو Table با نام های Table1 و Table2 دارد.
در Table1 فیلدی با نام Model و فیلدی با نام Code وجود دارد. فیلد Model عنوان مدل یک محصول و Code کد شناسایی مدل
را مشخص می کند :
کد:
ID	Model	Code
1	Model M1	MC1
2	Model M2	MC2
3	Model M3	MC3

در Table2 فیلد Code و فیلد Color وجود دارد که Color رنگ هایی که در هر مدل وجود دارد را مشخص می کند :
کد:
ID	Code	Color
1	MC1	Red
2	MC1	Green
3	MC1	Blue
4	MC1	Silver
5	MC2	Black
6	MC2	White
7	MC3	Blue
8	MC3	Yellow
9	MC3	Magenta

ما بر اساس ارتباط میان فیلدهای Code ای که در هر دو جدول Table1 و Table2 وجود دارد، یک Query با نام Query 1 می سازیم
که فیلد های Model و Code و Color را در خود لیست می کند. حسن استفاده از Query این است که بدون نیاز به کد نویسی،
ارتباط میان فیلد Code را در دو جدول نمایش می دهد. صرفا بایستی Query را بر اساس مدل انتخاب شده فیلتر کنیم تا
فقط رکوردهایی را نمایش دهیم که مربوط به یک Model خاص باشند.

در فرم برنامه، ما دو ComboBox با نام های comboBox1 و comboBox2 داریم.
در comboBox1 ما یکی از Model ها (از Table1) را انتخاب می کنیم و و در comboBox2 رنگ هایی که در فیلد Color مربوط
به کد آن Model انتخاب شده وجود دارند، از Query 1 استخراج شده و وارد لیست می شوند.

در داخل مشخصات comboBox1 مقدار DataSource روی table1BindingSource1 (که اشاره به جدول table1 دارد) و مقدار
DisplayMember روی فیلد Model در Table1 قرار دارد. به همین دلیل، به محض اجرا شدن برنامه، لیست Model هایی که
در Table1 ذخیره شده اند، بطور خودکار در comboBox1 درج می شوند.

کاری که ما اکنون بایستی با کد نویسی انجام دهیم، انتخاب کردن (Select) رکورد هایی از Query 1 است که Model
انتخاب شده در comboBox1 را شامل شوند و اضافه کردن فیلد Color آن رکورد ها در داخل comboBox2 می باشد :

کد:
            string Model = comboBox1.Text; 
            DataRow[] ModelColor;
            comboBox2.Items.Clear();
            if (Model.Length > 0)
            {
                ModelColor = databaseDataSet.Query_1.[B]Select[/B]("Model = '" + Model + "'");
                for (int i = 0; i < ModelColor.Length; i++)
                    comboBox2.Items.Add(ModelColor[i]["Color"]);
            }

توجه داشته باشید که مفاهیم پایگاه داده و برنامه نویسی دیتابیس با مباحث کنترل ها و زبان خاصی مانند #C ارتباط
مستقیمی ندارند. اگر با برنامه نویسی برای پایگاه داده آشنا باشید، در هر زبان ویژوالی می توانید به سادگی
مقصود خود را پیاده سازی کنید، وگرنه اینکه کنترل هدف شما ComboBox باشد یا DataGrid فرق چندانی نمی کند.
اگر احساس کردید که در بکارگیری کد های پایگاه داده مشکل دارید، از کتاب هایی که بصورت تخصصی به
برنامه نویسی بانک اطلاعاتی می پردازند استفاده کنید.

کد کامل برنامه به همراه فایل دیتابیس (Database.mdb) و فایل اجرایی (ComboBoxDatabase.exe) ضمیمه این پست
می باشد.
 

پیوست ها

  • ComboBoxDatabase.zip
    168.9 کیلوبایت · بازدیدها: 468

maziarch2

New Member
سلام.
من از این کد استفاده میکنم هیچ چیزی لود نمیشه. ممنون میشم راهنمایی کنید
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string[] items = { "" };
switch (comboBox1.SelectedIndex)
{
case 0:
items = new string[] { "", "1", "2", "3", "4", "5" };
break;
case 1:
items = new string[] { "", "A", "B", "C", "D", "E" };
break;
case 2:
items = new string[] { "", "v", "y", "x", "y", "z" };
break;
}
comboBox2.Items.Clear();
comboBox2.Items.AddRange (items);
comboBox2.SelectedIndex = 0;
comboBox2.Enabled = true;
}

private void Form1_Load(object sender, EventArgs e)
{
string[] items = {"From 1 To 5", "From A to E", "From v to z"};
comboBox1.Items.AddRange(items);
comboBox2.Enabled = false;
}
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام.
من از این کد استفاده میکنم هیچ چیزی لود نمیشه. ممنون میشم راهنمایی کنید
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string[] items = { "" };
switch (comboBox1.SelectedIndex)
{
case 0:
items = new string[] { "", "1", "2", "3", "4", "5" };
break;
case 1:
items = new string[] { "", "A", "B", "C", "D", "E" };
break;
case 2:
items = new string[] { "", "v", "y", "x", "y", "z" };
break;
}
comboBox2.Items.Clear();
comboBox2.Items.AddRange (items);
comboBox2.SelectedIndex = 0;
comboBox2.Enabled = true;
}

private void Form1_Load(object sender, EventArgs e)
{
string[] items = {"From 1 To 5", "From A to E", "From v to z"};
comboBox1.Items.AddRange(items);
comboBox2.Enabled = false;
}
با وجود اینکه شما آیتم هایی رو در ComboBox1 قرار می دهید بصورت پیشفرض در comboBox1 انتخابی صورت نمی گیره و لذا در انتهای کد Form1_Load مقدار SelectedIndex همچنان 1- میمونه.
و مادامی که کاربر گزینه ای رو در ComboBox1 انتخاب نکنه یا خودتون در کد Form1_Load یک سطر مشابه comboBox1.SelectedIndex = 0 رو اضافه نکنید تغییری در مقدار SelectedIndex صورت نمی گیره که comboBox1_SelectedIndexChanged فراخوانی بشه.
با توجه به اینکه قصدی برای تغییر SelectedIndex ندارید و می خواهید 1- باقی بمونه، خودتون باید در انتهای کد Form1_Load متد comboBox1_SelectedIndexChanged رو فراخوانی کنید :
کد:
comboBox1_SelectedIndexChanged(null, EventArgs.Empty);
 

جدیدترین ارسال ها

بالا