PDA

View Full Version : ارتباط دو comboBox در سی شارپ



rashidi_sm
سه شنبه 13 فروردین 1392, 16:51 عصر
سلام
من می خوام ارتباط بین دو تا comboBax ایجاد کنم، کد زیر را نوشتم، می خوام وقتی که در comboBox1 چیزی انتخاب می شود، آیتم های مرتبط با آن که در جدول تعریف شده در Combox2 نمایش داده شوند، می شه بگید کدوم قسمت کد زیر ایراد دارد که نتیجه مورد نظر را نمی گیرم
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;

namespace relatedComboBox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
string strSql, strCon;
strCon = "Provider=Microsoft.jet.OLEDB.4.0;" + "Data Source=D:\\dbt.mdb";
OleDbConnection con = new OleDbConnection(strCon);

con.Open();
OleDbDataAdapter da = new OleDbDataAdapter("select * from test ORDER BY sorat ASC", con);
DataSet ds = new DataSet();

ds.Tables.Add("test");
da.Fill(ds, "test");
comboBox1.DataSource = ds.Tables["test"];
// comboBox1.DisplayMember = ds.Tables["test"].Columns["sorat"].ToString();
comboBox1.DisplayMember = ds.Tables["test"].Columns["vazeyat"].ToString();
//comboBox1.ValueMember = ds.Tables["test"].Columns["id"].ToString();
comboBox1.ValueMember = ds.Tables["test"].Columns["sorat"].ToString();
con.Close();
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{

}

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{

}

private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
string strSql, strCon;
strCon = "Provider=Microsoft.jet.OLEDB.4.0;" + "Data Source=D:\\dbt.mdb";
OleDbConnection con1 = new OleDbConnection(strCon);
con1.Open();
OleDbDataAdapter sda4 = new OleDbDataAdapter("SELECT * FROM test2 WHERE t1 " + comboBox1.SelectedValue, con1);
DataSet ds4 = new DataSet();
ds4.Tables.Add("test2");
sda4.Fill(ds4, "test2");
comboBox2.DataSource = ds4.Tables["test2"];
comboBox2.DisplayMember = ds4.Tables["test2"].Columns["t1"].ToString();
con1.Close();
}
}
}

می شه لطفا بگید با چه دستوری می تونم وقتی اطلاعاتی وارد comboBox می شود، همان موقع combox به روز رسانی شود.

Yanehsar
سه شنبه 13 فروردین 1392, 17:23 عصر
سلام
من از Validating استفاده می کنیم یعنی وقتی که کمبوباکس فوکس خودشو از دست بده



try
{
if (con.State == ConnectionState.Closed)
con.Open();
da = new OleDbDataAdapter("select * from Sazman where DR_ID="+cbNameDr.SelectedValue+"", con);
DataSet dsSazman = new DataSet();
DataView dvsazman = new DataView();
da.Fill(dsSazman, "Sazman");
dvsazman.Table = dsSazman.Tables["Sazman"];
cbSazman.DataSource = dvsazman;
cbSazman.DisplayMember = "Name";
cbSazman.ValueMember = "ID";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (con.State == ConnectionState.Open)
con.Close();
}

rashidi_sm
سه شنبه 13 فروردین 1392, 18:10 عصر
امکانش هست فایل این برنامه رو بزارید اینجا تا ببینم و بهتر متوجه بشم؟

Yanehsar
سه شنبه 13 فروردین 1392, 19:19 عصر
امکانش هست فایل این برنامه رو بزارید اینجا تا ببینم و بهتر متوجه بشم؟
1- بایند کردن اطلاعات بانک به کمبوباکس 1


try
{
if (con.State == ConnectionState.Closed)
con.Open();
da = new OleDbDataAdapter("select * from Nametable", con);
da.Fill(ds, "Nametable");
dv.Table = ds.Tables["Nametable"];
cbName.DataSource = dv;
cbName.DisplayMember = "Namefiled";
cbName.ValueMember = "ID";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (con.State == ConnectionState.Open)
con.Close();
}

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


try
{
if (con.State == ConnectionState.Closed)
con.Open();
da = new OleDbDataAdapter("select * from Nametable where NameFiled="+cbName.SelectedValue+"", con);
DataSet dsSazman = new DataSet();
DataView dvsazman = new DataView();
da.Fill(dsSazman, "Nametable");
dvsazman.Table = dsSazman.Tables["Nametable"];
cbSazman.DataSource = dvsazman;
cbSazman.DisplayMember = "Name";
cbSazman.ValueMember = "ID";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (con.State == ConnectionState.Open)
con.Close();
}

khokhan
سه شنبه 13 فروردین 1392, 19:39 عصر
با سلام

البته بایستی متوجه بود که کمبو باکسهای مرتبط به هم به دوشیوه امکان پذیره ها:لبخند:

Yanehsar
سه شنبه 13 فروردین 1392, 20:52 عصر
با سلام

البته بایستی متوجه بود که کمبو باکسهای مرتبط به هم به دوشیوه امکان پذیره ها:لبخند:
ممنون میشم توضیح بدید تا یاد بگیرم . مرسی

khokhan
سه شنبه 13 فروردین 1392, 21:23 عصر
با سلام مجدد

یک روش اینه که شما تنها از یک جدول واحد استفاده کنید یعنی اینکه از یه جدول یک ستون برای کمبوی اولی و از ستونی دیگر برای کمبوی دومی استفاده کنید

این حالت ساده ترین روش هست وخیلی آسون صورت می گیرد

2 . روش دوم که یه کم دشوار از روش قبلی هستش اینه که کمبوی اولی از یه ستون در یک جدول از دیتابیس پر بشه و کمبوی دومی از یک ستون از یک جدول دیگه در همان دیتابیس تغذیه بشه البته در این روش اختصاص کلید در هر دو جدول نقش اساسی داره

در هر دوروش بایستی کمبوی اولی رو که متصل کردی کمبوی دومی رو در رویداد SelectedIndexChanged کمبو باکس اول مقدار دهی کنی

موفق باشی

Yanehsar
سه شنبه 13 فروردین 1392, 23:02 عصر
با سلام مجدد

یک روش اینه که شما تنها از یک جدول واحد استفاده کنید یعنی اینکه از یه جدول یک ستون برای کمبوی اولی و از ستونی دیگر برای کمبوی دومی استفاده کنید

این حالت ساده ترین روش هست وخیلی آسون صورت می گیرد

2 . روش دوم که یه کم دشوار از روش قبلی هستش اینه که کمبوی اولی از یه ستون در یک جدول از دیتابیس پر بشه و کمبوی دومی از یک ستون از یک جدول دیگه در همان دیتابیس تغذیه بشه البته در این روش اختصاص کلید در هر دو جدول نقش اساسی داره

در هر دوروش بایستی کمبوی اولی رو که متصل کردی کمبوی دومی رو در رویداد SelectedIndexChanged کمبو باکس اول مقدار دهی کنی

موفق باشی
این روش شما فرقی با کد های که من در بالا آوردم فرقی نداره تنها تفاوتش در کد نوشتن در رویداد کمبوباکس هستش .
موافق یاشید

khokhan
چهارشنبه 14 فروردین 1392, 00:50 صبح
با سلام مجدد

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

اگه برای نوع دوم هم نمونه خواستی بگو :لبخند:

rashidi_sm
چهارشنبه 14 فروردین 1392, 16:19 عصر
اگر امکانش هست، ممنون می شم برای نوع دوم هم نمونه قرار بدید
با سپاس

shm184
پنج شنبه 21 شهریور 1392, 20:31 عصر
با سلام مجدد

یک روش اینه که شما تنها از یک جدول واحد استفاده کنید یعنی اینکه از یه جدول یک ستون برای کمبوی اولی و از ستونی دیگر برای کمبوی دومی استفاده کنید

این حالت ساده ترین روش هست وخیلی آسون صورت می گیرد

2 . روش دوم که یه کم دشوار از روش قبلی هستش اینه که کمبوی اولی از یه ستون در یک جدول از دیتابیس پر بشه و کمبوی دومی از یک ستون از یک جدول دیگه در همان دیتابیس تغذیه بشه البته در این روش اختصاص کلید در هر دو جدول نقش اساسی داره

در هر دوروش بایستی کمبوی اولی رو که متصل کردی کمبوی دومی رو در رویداد SelectedIndexChanged کمبو باکس اول مقدار دهی کنی

موفق باشی


میشه لطف کنین مورد دوم رو با کد توضیح بدین؟

khokhan
پنج شنبه 21 شهریور 1392, 20:55 عصر
میشه لطف کنین مورد دوم رو با کد توضیح بدین؟
کل پروژه دو قسمت بیشتر نیست :لبخند:
کمبوی مربوط به استان در رویداد لود فرم از فیلد State پر می شه البته برای اینکه نام استان چندمرتبه در این فیلد تکرار شده بنابر این برای اینکه گزینه های کمبو تکراری نباشه کوئری با DISTINCT اجرا می شه :


private void Form3_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(strCon);
str = "SELECT DISTINCT State from zirna order by State asc";
com = new SqlCommand(str, con);
sqlda = new SqlDataAdapter(com);
ds = new DataSet();
sqlda.Fill(ds, "zirna");
comboBox1.DataSource = ds.Tables["zirna"].DefaultView;
comboBox1.DisplayMember = "State";


}

کدهای پر کردن کمبوی مربوط به شهر ها در رویداد SelectedIndexChanged کمبوی مربوط به استانها نوشته شده
تا به محض تغیر در گزینه انتخابی استان شهرهای مربوط به همان استان در کمبوی دوم ریخته بشه

والبته با توجه به فیلد id استان ها

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex != -1)
{
SqlConnection con = new SqlConnection(strCon);
SqlDataAdapter da = new SqlDataAdapter("SELECT city FROM zirna WHERE State= @pid", con);
da.SelectCommand.Parameters.AddWithValue("@pid", (((DataRowView)comboBox1.SelectedItem)["State"].ToString()));
DataTable tbl2 = new DataTable();
da.Fill(tbl2);
comboBox2.DataSource = tbl2;
comboBox2.DisplayMember = "city";

}

else
comboBox2.DataSource = null;

}

farzad_1354
یک شنبه 13 بهمن 1392, 21:13 عصر
با سلام
این نمونه پروژه که گذاشتی دیتابیسش باز نمیشه با چه ورژنی نوشته شده ؟؟؟؟

sanestian
یک شنبه 01 تیر 1393, 14:37 عصر
یا سلام
یه سوال داشتم من یه windows form دارم که صفحه ثبت نام هست و در اوب تاریخ تولد رو با 3 تا combobox وارد یک فیلد دیتابیس به نام bdate ذخیره میکنم ولی دچار مشکل شدم کدم به صورت زیره:
con.Open();
string query="insert into Personal(First_Name,Last_Name,IDNo,MelliCode,BPlac e,Father_Name,Tel,Address,Id_Edu,Branch,Password,I d_Semat,Sex,Married) VALUES ('"+txtName.Text+"','"+txtFname.Text+"','"+txtIDNo.Text+"','"+txtMelliCode.Text+"','"+cbBPlace.Text+"','"+txtFatherName.Text+"','"+txtMobile.Text+"','"+txtAddress.Text+"','"+cbEdu.SelectedValue+"','"+txtBranch.Text+"','"+txtPassword.Text+"','"+cbSemat.SelectedValue+"','"+cbSex.SelectedValue+"','"+cbMarried.SelectedValue+"')";
SqlCommand cmd = new SqlCommand();
cmd.Parameters.Add("Bdate",Convert.ToDateTime(cbBYear.Text+"/"+cbBMonth.Text+"/"+cbBYear.Text));
cmd.CommandText = query;
cmd.Connection = con;
cmd.ExecuteNonQuery();
MessageBox.Show(".اطلاعات شما با موفقیت ثبت گردید");
}

rahmat1359
سه شنبه 19 تیر 1397, 11:03 صبح
کل پروژه دو قسمت بیشتر نیست :لبخند:
کمبوی مربوط به استان در رویداد لود فرم از فیلد State پر می شه البته برای اینکه نام استان چندمرتبه در این فیلد تکرار شده بنابر این برای اینکه گزینه های کمبو تکراری نباشه کوئری با DISTINCT اجرا می شه :


private void Form3_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(strCon);
str = "SELECT DISTINCT State from zirna order by State asc";
com = new SqlCommand(str, con);
sqlda = new SqlDataAdapter(com);
ds = new DataSet();
sqlda.Fill(ds, "zirna");
comboBox1.DataSource = ds.Tables["zirna"].DefaultView;
comboBox1.DisplayMember = "State";


}

کدهای پر کردن کمبوی مربوط به شهر ها در رویداد SelectedIndexChanged کمبوی مربوط به استانها نوشته شده
تا به محض تغیر در گزینه انتخابی استان شهرهای مربوط به همان استان در کمبوی دوم ریخته بشه

والبته با توجه به فیلد id استان ها

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex != -1)
{
SqlConnection con = new SqlConnection(strCon);
SqlDataAdapter da = new SqlDataAdapter("SELECT city FROM zirna WHERE State= @pid", con);
da.SelectCommand.Parameters.AddWithValue("@pid", (((DataRowView)comboBox1.SelectedItem)["State"].ToString()));
DataTable tbl2 = new DataTable();
da.Fill(tbl2);
comboBox2.DataSource = tbl2;
comboBox2.DisplayMember = "city";

}

else
comboBox2.DataSource = null;

}



​میشه محبت کنی دستور linq رو هم بنویسی برام. خیلی ممنونم