PDA

View Full Version : combobox



arash ahmadi
شنبه 27 مرداد 1386, 17:19 عصر
با سلام. اگه بخواهم 2 تا کومبو باکس مرتبط با هم طراحی کنم. چه راهی پیشنهاد می

دهید؟ برای کمبوباکس اولی نام طرح را وارد کنم. و در کومبو باکس دوم نام پروژه های مرتبط با

همان طرح نمایش داده شود..مطالبی که در تالار دیدم برای (فیلدهای یک جدول بود) اما من

برای فیلد 2 جدول (که یکی از فیلدها مشترک است چون رابطه 1 به n بین انها وجود دارد)

می خواهم این کار را انجام بدهم.

hdv212
شنبه 27 مرداد 1386, 19:04 عصر
خب باید بین جداولت، RelationShip برقرار باشه، اگه اینطوریه، یکی از ComboBox ها باید از جدول پر بشه (نام طرح باید به صورت کامل لود بشه)، و ComboBox دومی هم از جدول دوم (مقادیر نام پروژه، باید به شرطی پر بشه که فیلد نام طرح برابر به خاصیت Text یا Value ComboBox اولی باشه)، در رویداد SelectedIndexChanged کومبوباکس اولیت باید ComboBox دومیت رو پر کنی.

PC2st
شنبه 27 مرداد 1386, 19:44 عصر
دوست عزیز، برای اینکار به کد زیر نگاه بندازید:


DataSet ds = new DataSet();

ds.Tables.Add("One");
ds.Tables.Add("Two");

ds.Tables["One"].Columns.Add("A", typeof(string));
ds.Tables["Two"].Columns.Add("A", typeof(string));
ds.Tables["Two"].Columns.Add("B", typeof(string));

ds.Relations.Add("Primier", ds.Tables["One"].Columns["A"], ds.Tables["Two"].Columns["A"]);

ds.Tables["One"].Rows.Add("VVDA");
ds.Tables["One"].Rows.Add("XCSC");

ds.Tables["Two"].Rows.Add("VVDA", "Manager");
ds.Tables["Two"].Rows.Add("VVDA", "Publisher");
ds.Tables["Two"].Rows.Add("VVDA", "Tanker");
ds.Tables["Two"].Rows.Add("XCSC", "Manager");
ds.Tables["Two"].Rows.Add("XCSC", "Voice Maker");
ds.Tables["Two"].Rows.Add("XCSC", "Patterned!");
ds.Tables["Two"].Rows.Add("XCSC", "Micky Mouse");
ds.Tables["Two"].Rows.Add("XCSC", "Tom and Jerry");
ds.Tables["Two"].Rows.Add("XCSC", "DOOM 3");

comboBox1.DataSource = ds;
comboBox1.DisplayMember = "One.A";

comboBox2.DataSource = ds;
comboBox2.DisplayMember = "One.Primier.B";

در کد فوق، یک DataSet بنام ds نمونه سازی شده است، که در این DataSet دو تا جدول بنام One و Two ایجاد شده که جدول One دارای فیلد A و جدول Two دارای فیلدهای A و B است. سپس یک رابطه یک به چند (میان فیلد A از جدول One و فیلد A از جدول Two) ایجاد میشود و نام آنرا Primier میگذاریم.

کمی پائین تر، رکوردها را به جداول One و Two اضافه کردم.

با فرض اینکه در فرم، دو ComboBox بنامهای comboBox1 و comboBox2 وجود دارد، با توجه به اینکه نام رابطه یک به چند را بنام Primier قرار داده ایم، این دو ComboBox به گونه ای به DataSet وصل شده که رابطه میان جداول هم در نظر گرفته شود. و با انتخاب یک گزینه از comboBox1، گزینه های comboBox2 هم تغییر می یابند.

اگر سوالی بود در خدمتم.

arash ahmadi
شنبه 27 مرداد 1386, 20:12 عصر
با تشکر ازشما

hdv212 میشه کد را برایم بگذارید. ممنون می شوم.

pc2st.ir راه حل شما هم خوبه.ولی اگه رکوردهام پویا باشه (با راه حل شما اگه یک رکورد اضافه بشه هر بار باید در برنامه ds را با اون پرکنم) چه کار باید انجام بدهم؟

PC2st
شنبه 27 مرداد 1386, 20:48 عصر
ولی اگه رکوردهام پویا باشه (با راه حل شما اگه یک رکورد اضافه بشه هر بار باید در برنامه ds را با اون پرکنم) چه کار باید انجام بدهم؟
منظور شما رو متوجه نشدم!؟ پویا و غیر پویا نداره، چون وقتی توسط DataAdapter اطلاعات رو از Database میخونی و توی یک DataSet میریزی، اون وقت از این دیتاست استفاده میکنید، به همون روشی که نوشتم، همین! :-)
بهرحال اگر خواستید از روش دیگه ای استفاده کنید.

hdv212
شنبه 27 مرداد 1386, 21:30 عصر
اینم یه نمونه کدی که میتونه کمکت کنه (البته شما به جای نوع کنترل LookUpEdit از همون ComboBox و خصوصیت های خودش استفاده کن) :

public void Load_tbl_city(LookUpEdit lookup)
{
DataTable dt = new DataTable();
DataAccess.Command.CommandText = "sp_select_city";
DataAccess.Command.CommandType = System.Data.CommandType.StoredProcedure;
DataAccess.Command.Parameters.Clear();
if (DataAccess.Connection.State == ConnectionState.Closed)
DataAccess.Connection.Open();
DataAccess.Reader = DataAccess.Command.ExecuteReader();
dt.Load(DataAccess.Reader);
DataAccess.Reader.Close();
if (DataAccess.Connection.State == ConnectionState.Open)
DataAccess.Connection.Close();

lookup.Properties.DataSource = dt.DefaultView;
lookup.Properties.DisplayMember = "cityName";
lookup.Properties.ValueMember = "cityID";
DevExpress.XtraEditors.Controls.LookUpColumnInfo col = new DevExpress.XtraEditors.Controls.LookUpColumnInfo("cityName", "شهر", 100);
lookup.Properties.Columns.Add(col);
}

کد بالایی، Combox رو از جدول City پر میکنه، حالا وقتی کاربر یه شهر رو انتخاب میکنه، رویداد SelectedIndexChanged مربوط به Combox بالایی اتفاق میفته و ComboBox دومی از جدول مناطق پر میشه (یادت باشه برای لود کردن اطلاعات جدول مناطق، به مقدار cityID کومبوباکس اولی نیاز داریم) ، اینم کد پر کردن CmboBox دومی :

public void Load_tbl_area(LookUpEdit lookup,object filterValue)
{
DataTable dt = new DataTable();
DataAccess.Command.CommandText = "sp_select_area";
DataAccess.Command.CommandType = System.Data.CommandType.StoredProcedure;
DataAccess.Command.Parameters.Clear();
System.Data.SqlClient.SqlParameter p1 = new System.Data.SqlClient.SqlParameter("@cityID", filterValue);
DataAccess.Command.Parameters.Add(p1);
if(DataAccess.Connection.State == ConnectionState.Closed)
DataAccess.Connection.Open();
DataAccess.Reader = DataAccess.Command.ExecuteReader();
dt.Load(DataAccess.Reader);
DataAccess.Reader.Close();
if(DataAccess.Connection.State == ConnectionState.Open)
DataAccess.Connection.Close();

lookup.Properties.DataSource = dt.DefaultView;
lookup.Properties.DisplayMember = "areaNumber";
lookup.Properties.ValueMember = "areaID";
if (lookup.Properties.Columns.Count > 0)
lookup.Properties.Columns.Clear();
DevExpress.XtraEditors.Controls.LookUpColumnInfo col = new DevExpress.XtraEditors.Controls.LookUpColumnInfo("areaNumber", "منطقه", 100);
lookup.Properties.Columns.Add(col);
}

اینم کد رویداد SelectedIndexChanged مربوط به ComboBox اولی :

private void lookUp_city_SelectedIndexChanged(object sender, EventArgs e)
{
Load_tbl_area(this.lookUp_area, this.lookUp_city.SelectedValue);
}