Я использую C # Winforms и SQL Server в качестве базы данных.
В моем Combobox_Leave
событии он заполнит другие Combobox
текстовым значением предыдущего
Это одномоего Combobox_Leave
события, оно похоже на другие Combobox
private void cmbPItem_Leave(object sender, EventArgs e)
{
using (SqlConnection conn = new SqlConnection(@"Server=" + ip + "," + port + "; Database=records; User ID=" + sqlid + "; Password=" + sqlpass + ""))
{
conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(@"SELECT DISTINCT [Brand]
FROM [dbo].[products] WHERE Item LIKE '" + cmbPItem.Text + "'", conn))
{
DataTable dt = new DataTable();
sda.Fill(dt);
if (dt.Rows.Count != 0)
{
cmbPBrand.Items.Clear();
for (int b = 0; b < dt.Rows.Count; b++)
{
cmbPBrand.Items.Add(dt.Rows[b][0].ToString());
}
}
}
using (SqlDataAdapter sda = new SqlDataAdapter(@"SELECT DISTINCT [Manufacturer]
FROM [dbo].[products] WHERE Item LIKE '" + cmbPItem.Text + "'", conn))
{
DataTable dt = new DataTable();
sda.Fill(dt);
if (dt.Rows.Count != 0)
{
cmbPMan.Items.Clear();
for (int m = 0; m < dt.Rows.Count; m++)
{
cmbPMan.Items.Add(dt.Rows[m][0].ToString());
}
}
}
using (SqlDataAdapter sda = new SqlDataAdapter(@"SELECT DISTINCT [Car]
FROM [dbo].[products] WHERE Item LIKE '" + cmbPItem.Text + "'", conn))
{
DataTable dt = new DataTable();
sda.Fill(dt);
if (dt.Rows.Count != 0)
{
cmbPCar.Items.Clear();
for (int i = 0; i < dt.Rows.Count; i++)
{
cmbPCar.Items.Add(dt.Rows[i][0].ToString());
}
}
}
using (SqlDataAdapter sda = new SqlDataAdapter(@"SELECT DISTINCT [Year]
FROM [dbo].[products] WHERE Item LIKE '" + cmbPItem.Text + "'", conn))
{
DataTable dt = new DataTable();
sda.Fill(dt);
if (dt.Rows.Count != 0)
{
cmbPYr.Items.Clear();
for (int y = 0; y < dt.Rows.Count; y++)
{
cmbPYr.Items.Add(dt.Rows[y][0].ToString());
}
}
}
conn.Close();
}
}
И вывод такой:

Когда пользователь нажимает на второй Combox
, в этом примере cmbPBrand
.Он заполняет Combobx
дублированными значениями.Но когда пользователь нажимает другую Combobox
, не выбирая какую-либо запись из cmbPBrand
.Значения не дублируются.

Другой пример дублированных значений.

В этом cmbPYr
нажимается после выбора из cmbPItem
.Он дублирует значения DISTINCT
.
Обратите внимание, что это происходит, когда пользователь CLICK
второй Combobox
.И я использую Leave
Событие для моих Combobox
.
Я также попытался добавить MouseClick
и MouseDown
и Enter
и SelectedIndexChanged
События.Но он все равно дублирует значения.
РЕДАКТИРОВАТЬ:
При использовании запроса
SELECT DISTINCT Brand,Manufacturer,Car,Year FROM [dbo].[products] WHERE Item LIKE 'BRAKE PADS'
Где cmbPItem.Text, например, равен BRAKE PADS
.

Он запросит почти 675 строк.

РЕДАКТИРОВАТЬ: Что касается предложения Кевина.Это код только для бренда ComboBox
, но он по-прежнему показывает повторяющиеся значения.
private void cmbProd_Enter(object sender, EventArgs e) {
itemValue(cmbPItem.Text); }
private void itemValue(string sitem) {
getBrand(sitem); }
private void getBrand(string sitem) {
using (SqlCommand cmd = new SqlCommand(@"SELECT DISTINCT [Brand] FROM [dbo].[products] WHERE Item = @Item"))
{
cmd.Parameters.Add(new SqlParameter("Item", sitem));
populateBrand(cmbPBrand, cmd);
} }
private void populateBrand(ComboBox cmb, SqlCommand cmd) {
using (SqlConnection conn = new SqlConnection(@"Server=" + ip + "," + port + "; Database=records; User ID=" + sqlid + "; Password=" + sqlpass + ""))
{
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
cmd.Connection = conn;
DataTable dt = new DataTable();
sda.Fill(dt);
if (dt.Rows.Count != 0)
{
cmb.Items.Clear();
for (int b = 0; b < dt.Rows.Count; b++)
{
cmb.Items.Add(dt.Rows[b][0].ToString());
}
}
conn.Close();
}
} }