[英]Dependently and Dynamically change Combo Box Value List in C# WinForm
在My C#WinForm中,有兩個comboboxes
稱為cmbTransFirstHelper
和cmbTransSecondHelper
。 這些組合框是從數據庫中的同一表和同一列填充的。 我使用External DataLoad
類從數據庫中獲取數據,然后將DataTable類型返回給WinForm類。 winform類中有兩個函數,分別稱為loadFirstHelper
和loadSecondHelper
,用於將數據填充到上述組合框,並且這些函數在加載表單時正在調用。
現在,我cmbTransFirstHelper
,當我在cmbTransFirstHelper
組合框中選擇一個值時, cmbTransFirstHelper
cmbTransSecondHelper
值列表以及v / v中刪除該值。
可能嗎 ? 我該怎么辦?
這是我的DataLoad Class函數,它從數據庫中獲取數據,
public DataTable loadEmployees(string category)
{
con.OpenConection();
SqlDataAdapter sda = con.DataAdapter("select * from employees where employee_category ='"+ category +"'");
DataTable dt = new DataTable();
sda.Fill(dt);
return dt;
con.CloseConnection();
}
這些是我的loadFirstHelper
和loadSecondHelper
函數
private void loadFirstHelper()
{
dt = dl.loadEmployees("Helper");
dr = dt.NewRow();
dr.ItemArray = new object[] { 0, "--Select Helper--" };
dt.Rows.InsertAt(dr, 0);
cmbTransFirstHelper.ValueMember = "employee_id";
cmbTransFirstHelper.DisplayMember = "employee_name";
cmbTransFirstHelper.DataSource = dt;
}
private void loadSecondHelper()
{
dt = dl.loadEmployees("Helper");
dr = dt.NewRow();
dr.ItemArray = new object[] { 0, "--Select Helper--" };
dt.Rows.InsertAt(dr, 0);
cmbTransSecondHelper.ValueMember = "employee_id";
cmbTransSecondHelper.DisplayMember = "employee_name";
cmbTransSecondHelper.DataSource = dt;
}
這就是我在formLoad事件中調用上述函數的方式
private void transVehicleINOUT_Load(object sender, EventArgs e)
{
this.loadVehicles();
this.loadDiver();
this.loadItems();
this.loadFirstHelper();
this.loadSecondHelper();
}
有什么辦法可以解決我的問題?
您可以通過過濾第二個comobobox的現有DataSource來刪除項目。
var original = (DataTable)cmbTransSecondHelper.DataSource;
var selected = (int)cmbTransSecondHelper.SelectedValue;
var filtered =
original.AsEnumerable()
.Where(row => row.Field<int>("employee_id") != selected)
.CopyToDataTable();
cmbTransSecondHelper.DataSource = filtered;
如果要在第一個組合框中選擇另一個值時返回移除的值,則可以將原始集合保存在局部變量中,並將其用於過濾。
將動態數據傳遞到sql查詢時,請始終使用SqlParameters。
如果可能,請嘗試為每個查詢創建並配置新的連接。
也只從數據庫中加載您實際需要的數據,請不要使用SELECT * FROM
在您的特定情況下,我不會僅對兩個數據字段使用“大量” DataTable。
創建一個類,並使用集合將其用作數據源。
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
public List<Employee> LoadEmployees(string category)
{
var query =
"SELECT employee_id, employee_name FROM employees WHERE employee_category=@category";
var parameter = new SqlParameter
{
ParameterName = "@category",
SqlDbType = SqlDbType.Varchar,
Value = category
};
var employees = new List<Employee>();
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(query, connection))
{
connection.Open();
command.Parameters.Add(parameter);
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var employee = new Employee
{
Id = reader.GetInt32(0),
Name = reader.GetString(1)
};
employees.Add(employee);
}
}
return employees;
}
}
這樣一來,您只能使用一種功能,以所需的數據填充給定的組合框。
private void FillWithHelpers(ComboBox combobox)
{
var select = new Employee { Id = 0, Name = "--Select Helper--" };
var all = LoadEmployees("Helper");
all.Insert(0, select);
combobox.ValueMember = "Id";
combobox.DisplayMember = "Name";
combobox.DataSource = all;
}
然后在Load事件處理程序中為兩個comobobox調用此函數
private void TransVehicleINOUT_Load(object sender, EventArgs e)
{
this.loadVehicles();
this.loadDiver();
this.loadItems();
this.FillWithHelpers(cmbTransFirstHelper);
this.FillWithHelpers(cmbTransSecondHelper);
}
在第一個組合框的SelectionChangeCommitted
事件處理程序中,您可以輕松地濾除所選值。
private void cmbTransFirstHelper_SelectionChangeCommitted(object sender, EventArgs e)
{
var original = (List<Employee>)cmbTransSecondHelper.DataSource;
var selectedId = (int)cmbTransSecondHelper.SelectedValue;
var filtered =
original.Where(employee => employee.Id != selectedId).ToList();
cmbTransSecondHelper.DataSource = filtered;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.