在我的C#WinForm中,有两个分别称为comboboxes
和cmbTransFirstHelper
的{{1}}。这些组合框是从数据库中的同一表和同一列填充的。我使用外部cmbTransSecondHelper
类从数据库中获取数据,然后将DataTable类型返回给WinForm类。 Winform的类中有两个名为DataLoad
和loadFirstHelper
的函数,用于将数据填充到上述组合框,而这些函数在加载表单时正在调用。
现在我要这样做,当我在loadSecondHelper
组合框中选择一个值时,应从cmbTransFirstHelper
值列表以及v / v中删除该值。
有可能吗?以及我该怎么做?。
这是我的DataLoad Class函数,它从数据库获取数据,
cmbTransSecondHelper
这些是我的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
这就是我在formLoad事件中调用上述函数的方式
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;
}
有什么办法可以解决我的问题?
答案 0 :(得分:1)
您可以通过过滤第二个comobobox的现有数据源来删除项目。
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;
}