PDA

View Full Version : سوال: کمک در کار با Combo box



malakootian
چهارشنبه 26 مرداد 1390, 20:39 عصر
سلام بچه ها
من می خوام یکسری اطلاعات را از دیتا بیس بریزم داخل کمبو باکس اما بایکسری شرایط به این صورت که نام خانوادگی به عنوان متن قرار بگیرد و کد هرشخص به عنوان ایندکس آن باشد تا با انتخاب هر شخص کد ان را بگیرم باید بگم چون در فرمم چندتا کمبوباکس از طریق cmbbox.dadamemberdisplayو cmbbox.valuemember هر کاری کردم نشد که چندتا کمبوباکس را پر کنم فقط نهایتا یکیشون پر می شد حالا بنظرتون چی کارکنم؟؟

morteza271
چهارشنبه 26 مرداد 1390, 21:02 عصر
احتمالا یه جایی از کار دارین اشتباه می کنید.
لطف کنید اگه امکانش هست کدتون رو بذارین تا سریعتر به جواب برسین.

malakootian
چهارشنبه 26 مرداد 1390, 23:07 عصر
string SqlText;
DataSet ds2 = new DataSet();
SqlDataAdapter sda2 = new SqlDataAdapter();
DataView dv1 = new DataView(ds2.Tables["TBase"]);
SqlText = "SELECT (BName+N' '+BFamily)As FullName,Code,BInfoCode FROM TBase where BInfoCode=3";
Connect();
cmd.CommandText = SqlText;
cmd.Connection = cnn;
sda2.SelectCommand = cmd;
cnn.Open();
sda2.Fill(ds2, "TBase");
cnn.Close();
curM = (CurrencyManager)this.BindingContext[dv1];
curM.Position = 0;
cmb3.DataSource = dv1;
cmb3.DisplayMember = "FullName";
cmb3.ValueMember = "Code";
کد از لحاظ وصل شدن به دیتا بیس مشکل نداره و باید بگم فیلد Codeدر جدولم Identity است واتوماتیک اضافه می شه بعضی وقتها درست کار می کنه و خیلی وقتها ایراد می گیره که نمی تونه codeرا به value member اضافه کنه درضمن من چون چندتا کمبو در فرم دارم می خواستم جدول را چند بار فیلتر کنم و هر بار مقادیر را در یک کمبو بریزم که نمی شدوفقط کمبو آخر پر می شد.؟؟؟؟؟

mas'oud
چهارشنبه 26 مرداد 1390, 23:39 عصر
به نظر من به جاي اينكه بخواهيد انديس كمبوباكس را بايند كنيد، بريد دستور سلكتي بنويسيد كه كد آيتمي كه انتخاب شده را بدست بياورد.

k_ce_esf
پنج شنبه 27 مرداد 1390, 00:35 صبح
من هر وقت بخوام در combo boxم یه نام ذخیره کنم و یه جایی هم کدهاش را داشته باشم،هیچ وقت از روشی که شما میگین استفاده نمیکنم.
یه list box هم قرار میدم،همون موقع که در combo نام ها ذخیره میکنم در listbox کد ها را ذخیره میکنم و فقط در text changed مربوط به combo میگم selected index ش را برابر selected index مربوط به list box قرار بده،این طوری دیگه من با combo و مقادیرش کاری ندارم و فقط ازش برای نمایش به کاربر استفاده میکنم،در ثبت در بانکم و همه کارها از selected item در list box استفاده میکنم،خیلی راحت

malakootian
پنج شنبه 27 مرداد 1390, 00:52 صبح
آخه این کار را قلا در VB6از طریقNew ITem Data به راحتی می کردم و خیلی کار باهاش راحت بود یعنی هر ایندکس که خودت می خواستی را به آیتمهای کمبو می دادی و بازیابی می کردی اما حلا در C# نمی دونم چرا سخت شده به جای اینکه راحتتر بشه به هر حال اگه کدی،فکری دارید بگید تو رو به خدا ممنون

k_ce_esf
پنج شنبه 27 مرداد 1390, 01:25 صبح
من نمیدونم کاری که من میکنم بهترین راه حله یا نه،اما من روشی که گفتم را یکی از افرادی که خیلی در زمینه برنامه نویسی وارده به من پیشنهاد کردن و من هم همه جا ازش استفاده می کنم و بهم خیلی خوب جواب میده.
لبته روش شما هم روش منطقی به نظر میاد،دوستان لطفا بگن کدوم روش بهتره؟

morteza271
پنج شنبه 27 مرداد 1390, 01:28 صبح
من معمولا از این روش استفاده میکنم :
این کدی است کا با آن اطلاعات جدول test را از دیتابیس test رو در کامبوباکس نمایش میدم :
private void button6_Click(object sender, EventArgs e)
{
string strQry = "select code, name from test";
SqlConnection con = new SqlConnection("Data Source=(local);Initial Catalog=test;Integrated Security=True");
SqlCommand cmd = new SqlCommand(strQry, con);
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);

comboBox1.DataSource = dt;
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "code";
}

این کد و نام اشخاص ذخیره شده در جدول test را میخواند و نام آنها را در کامبوباکس نمایش می دهد و کد آنها هم به عنوان Value در کامبوباکس ذخیره میشه.
حالا با این کد میتونیم به کد شخصی که انتخاب شده دسترسی داشته باشیم :
comboBox1.SelectedValue.ToString()

دیگه نه نیازی هست که کد رو در listview ذخیره کرد و نه لازمه که بعد اینکه یکی از اشخاص انتخاب شد دوباره به دیتابیس رجوع کنیم و کد شخص رو پیدا کنیم!!

حالا شما دوستان بگین کدوم راه بهتره؟؟؟
موفق باشید

malakootian
پنج شنبه 27 مرداد 1390, 01:38 صبح
به نظرم و قطعا دوست عزیزم Troski کارتون خیلی عالیه و من هم می خوام از همین روش الان اسفاده کنم اما:
1- نمی دونم چرا وقتی من فیلد Code را می دهم به value member خطا میگیره
2-من چندتا کمبو باکس دارم و با این کار فقط کمبو آخر پر میشه حتی اگه با چند روال جدا بخواهم اونها را پر کنم

morteza271
پنج شنبه 27 مرداد 1390, 01:54 صبح
دوست عزیز فکر کنم شما اگه این قسمت cmb3.DataSource = dv1; از کدتون رو به صورت زیر تغییر بدین درست میشه :
cmb3.DataSource = ds2.Tables["TBase"];

malakootian
پنج شنبه 27 مرداد 1390, 17:59 عصر
سلام دوست عزیز troski با کدی که قبلا شما دادید مشکل ارتباطم حل شد اما مسئله اینجاست که چون چند کمبو دارم که همگی از یک دیتا تیبل خاص پر می شوند و هرکدوم مقادیر خاصی را نمایش می دهند وقتی می خوام چند تا را پر کنم هیچ کدوم پر نمی شوند.
در تلاش جدیدم چندتا دیتا تیبل جدید ساختم و هر کمبو را به یکی وصل کردم راه سختی بود اما شدنی حالا مسئله ای که پیش اومد این بود که وقتی میخوام 2تا از کمبو ها را مثل هم پرکنم مقادیر را می گیرند اما باانتخاب یک مقدار در کمبو اول مقدار کمبو دوم نیز مان خواهد شد.
مثال
از جدولی می خوام نام چند نفر را استخراج کنم مثلا یکی به عنوان کارگردان-یکی به نام هنرپیشه حالا وقتی اینکار را می کنم و کمبو ها مقدار میگیرند با انتخاب یکی کمبو بعدی هم همون مقدار را میگیره.
ودر ضمنی که فکر ساخت چندین دیتا تیبل هم که به فکرم رسیده به نظر خودم مسخره است و نباید این قدر یک کار ساده را به سختی انجام داد

قبلا از این همه پیگیری شما متشکرم وممنون

HOJAT1
پنج شنبه 27 مرداد 1390, 18:07 عصر
سلام به نظر بنده از یه کلاس fillombo به راحتی می تونی این کار رو بکنی.به این صورت که فقط در لود فرمت اون کمبو رو پر میکنی.
مثال : یه کلاس تعرف میکنی به اسم combo و این تابع رو براش می نویسی


publicvoid FillCombo(SqlConnection connection, string sql, string id, string text, refComboBox cmb)

{


try

{


SqlCommand sqlCommand = newSqlCommand(sql, connection);


DataTable Table = newDataTable();


if (connection.State != ConnectionState.Open)

connection.Open();


SqlDataReader reader = sqlCommand.ExecuteReader();

Table.Load(reader);



cmb.DataSource = Table;

cmb.DisplayMember = text;

cmb.ValueMember = id;

cmb.SelectedIndex = -1;

}


catch (Exception ex)

{


MessageBox.Show(ex.Message.ToString());

}


finally

{

connection.Close();

}

}

حالا تو لود فرمت به فرض combokargardan رو اینطوری از بانکت select میکنی.
combo.FillCombo(connection, "SELECT ID,Name FROM tblkargardan order by ID asc", "ID", "Name", ref combokargardan );
برای استفاده از ای دی اون هم می تونی از selectvalue استفاده کن.
موفق باشی.

morteza271
پنج شنبه 27 مرداد 1390, 18:10 عصر
انتخاب یکی کمبو بعدی هم همون مقدار را میگیره.
درسته!
وقتی به دو کامبوباکس یک دیتاتیبل رو پاس بدین همین اتفاق می افته و راه دیگه ای جز این ندارین که به ازی هر کامبوباکس یک دیتاتیبل دیگر بسازید.
برای این کار، کار خاصی لازم نیست انجام بدین.
به کد زیر دقت کنید:
این کد همون کد قبلی هست ولی دو تا کامبوباکس رو پر میکنه :
string strQry = "select code, name from test";
SqlConnection con = new SqlConnection("Data Source=(local);Initial Catalog=test;Integrated Security=True");
SqlCommand cmd = new SqlCommand(strQry, con);
DataTable dt = new DataTable();
DataTable dt2 = new DataTable(); // new
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
da.Fill(dt2); // new

comboBox1.DataSource = dt;
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "code";

comboBox2.DataSource = dt2; // new
comboBox2.DisplayMember = "name"; // new
comboBox2.ValueMember = "code"; // new

در این کد فقط خط هایی که جلوش // new نوشته شده جدید هستند.این روش به نظرمن مسخره نیست و تنها راهی هست که دارین!
موفق باشید.

hamed_hossani
پنج شنبه 27 مرداد 1390, 18:14 عصر
سلام
من از اين روش استفاده مي كنم
comboBox1.DataSource=dt
comboBox1.DisplayMember=dt.Rows[0][0].tostring
comboBox1.ValueMember=dt.Rows[0][1].tostring

براي برگرداند مقدار هم
int32Parse(comboBox1.SelectedValue.tostring
البته داده خروجي من int است

malakootian
جمعه 28 مرداد 1390, 01:49 صبح
دوست عزیزم troski از این که ای قدر وقت برام گذاشتی و زحمت کشیده واقعا ممنونم من چون اینکار راقبلا با VB6 و از طریق new Item data براحتی و باهر ایندکسی که می خواستم انجام می دادم فکر می کردم در C#هم باید به همان راحتی اینکار انجام شود و من بلد نیستم حالا فهمیدم که نه و روش شما درست است.مطمئنا من هم از روش شما استفاده می کنم و ممنون
و یک نکته که من از یکی از دوستام شنیدم اما هنوز کاملا درکش نکردم گفتم بگم شاید شما که حرفه ای هستید بفهمید اون چی می گفته دوستم می گفت یک کلاس از id ,name بسازم و بعد یک شی از اون کلاس را بامقادیر نسبت دهی کنم و اون شی را به کمبو بدهم اینطوری هر آیتم از کمبو من یک شی خاص می تونه باشه و هر چیزی رو بخوام می تونم بهش بدم وبگیرم یک فکری بی زحمت روش بکن شما ببین بنظر شما شدنی است؟؟؟؟؟

morteza271
جمعه 28 مرداد 1390, 02:06 صبح
خواهش میکنم دوست عزیز.
خوشحالم که تونستم کمکتون کنم.

طوری که من از روشی که گفتین برداشت کردم این روش چیزی شبیه به روش دوستمون HOJAT1 که در همینجا گفتن هستش و به نظرم این روش برای حالتی که میخواین یه اطلاعات رو برای چند کامبوباکس نمایش بدین درست نیست چون به ازای هر کامبوباکس یه بار به دیتابیس وصل میشه!که این منطقی نیست.
موفق باشید.

sam_fisher_440
شنبه 23 مهر 1390, 19:13 عصر
پر کردن اطلاعات combo
من میخوام فیلد هایی رو از جدول بخونم و بریزم تو یه combo و بعد توی یه جدول دیگه ذخیره کنم.

هر کاری کردم یا ارور داشتم یا این آخریا مقدار صفر رو میریخت

این رو در کلاس entity جدول زدم.



public TarifDarkhast ()

{
DataTable dataTable = TM.FillDataTable("Select * from TarifDarkhast");

a = dataTable.Rows.Count;
if (a == 1)
{
DarkhastID = Convert.ToInt32(dataTable.Rows[0]["DarkhastID"]);
DarkhastText = dataTable.Rows[0]["DarkhastText"].ToString();


}

}




خیلی ور رفتم اما نشد آخرین بار هم این کار رو کردم که به تعداد سطر های جدول مقدار صفر رو برام لود میکرد تو combo




private void frmAddRequest_Load(object sender, EventArgs e)
{
TarifDarkhast t = new TarifDarkhast();

index=0;
while(index<t.a)
{

cmbShenase.Items.Insert(index,Convert.ToString(t.D arkhastID));

index++;

}
}



فیلد های که تو combo باید قرار بگیرند تو برنامه میتونن اضافه و یا کم بشن و مقدار ثابتی ندارن پس باید از جدول خونده بشن

در ضمن من تو برنامم هم از ویزارد به هیچ وجه استفاده نکردم و علاقه ای هم ندارم بهش.

باید چیکار کرد؟


این هم کلاس TM که برای ارتباط با بانک هستش ...!



class TM
{
static string ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\db.mdb";

public static DataTable FillDataTable(string SqlCom)
{
OleDbCommand ObjCommand = new OleDbCommand();
ObjCommand.Connection = new OleDbConnection(ConnectionString);
ObjCommand.CommandText = SqlCom;
OleDbDataAdapter ObjDataAdapter = new OleDbDataAdapter(ObjCommand);
DataTable dataTable = new DataTable();
ObjDataAdapter.Fill(dataTable);
return dataTable;
}
public static void ExecuteCommand(string SqlCom)
{
OleDbCommand ObjCommand = new OleDbCommand();
ObjCommand.Connection = new OleDbConnection(ConnectionString);
ObjCommand.CommandText = SqlCom;
ObjCommand.Connection.Open();
ObjCommand.ExecuteNonQuery();
ObjCommand.Connection.Close();
}
}