Я ученик и новичок в программировании, у меня есть два comboboxes, combobox1 и combobox2 combobox1, содержит мобильную компанию, такую как nokia, samsung, htc и combobox2, содержит мобильные модели, такие как samsung, s3 и т.д., я хочу сортировать два combobox, которые я имею в виду когда я нажимаю nokia в combobox1, тогда вся модель nokia должна быть видна в списке combobo2, поэтому я решил использовать отношения внешнего ключа
Manufacturer -table
- manufacturerid (primary key)
- name
Model -table
- modelid (primary key)
- manufacturerid (foreign key to manufacturer)
- name
Пример для данных:
Таблица производителей
manufacturerid name
-------------- ----------
1 Nokia
2 Samsung
3 HTC
Таблица моделей
modelid manufacturerid name
------- -------------- ----------
1 1 C7
2 1 Lumia 900
3 1 Lumia 920
4 2 Galaxy S II
5 2 Galaxy S III
6 3 Desire X
7 3 Windows Phone 8X
8 3 One S
я хочу, чтобы, если я выбираю nokia в первом combobox, тогда вторая combobox выберет все модели, которые являются производительностью = 1, что использовать? Как я могу это сделать? я использовал
private void comboBox4_SelectedIndexChanged(object sender, EventArgs e)
{
comboBox3.Text = "";
if ("samsung" == comboBox4.SelectedItem.ToString())
{
comboBox3.DataSource = table1BindingSource;
comboBox3.ValueMember = "samsung";
comboBox3.DisplayMember = "samsung";
}
if ("htc" == comboBox4.SelectedItem.ToString())
{
comboBox3.DataSource = table1BindingSource;
comboBox3.ValueMember = "htc";
comboBox3.DisplayMember = "htc";
}
}
но я должен обновлять строку samsung каждый раз, когда добавляю новую модель, поэтому я решил работать с таблицами, чтобы я мог обновить эту
В первом выпуске SelectedIndexChanged
(combobox) выберете select manufacturerid
а затем запустите этот запрос, чтобы заполнить другой combobox, т.е. (Модель)
Select modelid,name from modeltable where [email protected]
Код за чем- то Подобным образом, я просто написал этот код без просмотра IDE, может потребоваться некоторая модификация
private void monufactureComobobox_SelectedIndexChanged(object sender, EventArgs e)
{
string fecthManufacturerID= manufactureComobobox.selectedItem;
DataTable dtModel = new DataTable();
dtModel= ModelComboPopulate(fecthManufacturerID);
ModelcomboBox.DataSource = dtModel;
ModelcomboBox.ValueMember = "modelid";
ModelcomboBox.DisplayMember = "name";
}
public DataTable ModelComboPopulate(string ID)
{
DataSet ds = new DataSet();
using (SqlConnection con = new SqlConnection(connection))
{
string myquery="Select modelid,name from modeltable where [email protected]";
SqlCommand cmd = new SqlCommand(myquery, con);
SqlDataAdapter dap = new SqlDataAdapter();
dap.SelectCommand = cmd;
cmd.Parameters.Add("@combox1Value", SqlDbType.NVarChar, 15).Value = ID;
dap.Fill(ds);
return ds.Tables[0];
}
}
Включить функцию для извлечения данных из базы данных следующим образом
public DataTable Select(String sqlQuery)
{
con.Open();
SqlDataAdapter adapter = new SqlDataAdapter(sqlQuery,con);
DataTable table = new DataTable();
adapter.Fill(table);
con.Close();
return table;
}
и в событии Page_Load
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack)
{
String sqlQuery="select manufacturerid,name From Manufacturertable";
comboBox4.DataSource = cls.Select(sqlQuery);
comboBox4.DataTextField = "name";
comboBox4.DataValueField = "manufacturerid";
comboBox4.DataBind();
}
}
и в SelectedIndexChanged
событие comboBox4
protected void comboBox4_SelectedIndexChanged(object sender, EventArgs e) {
String sqlQuery="select modelid,name From Modeltable where manufacturerid="+ Convert.ToInt16(comboBox4.SelectedValue.ToString());
comboBox3.DataSource = cls.Select(sqlQuery);
comboBox3.DataTextField = "name";
comboBox3.DataValueField = "modelid";
comboBox3.DataBind();
}
Используйте DataSet
или DataTable
для хранения двух таблиц, а затем strArr
строки в строке списка strArr
. Что-то вроде ниже: (По крайней мере, логика должна работать)
List<string> strArr = new List<string>();
strArr.Items.Clear();
for(int intSubCount = 0; intSubCount < dtTable2.Rows.Count;intSubCount++)
{
if(MyComboBox.Text.Equals(dtTable2.Rows[intSubCount]["modelid"].ToString()))
{
strArr.Add(dtTable2.Rows[intSubCount]["name"].ToString());
}
}
//
comboBox3.DataSource = strArr;
Или иначе
Простым способом является использование DataView
DataView dv = dtTable1.defaultView;
dv.RowFilter("modelid = '" + myComboBox.Text + "'");
//use DataView to populate the Second ComboBox.