依赖并动态更改C#WinForm中的组合框值列表

时间:2018-08-15 12:48:08

标签: c# combobox

在我的C#WinForm中,有两个分别称为comboboxescmbTransFirstHelper的{​​{1}}。这些组合框是从数据库中的同一表和同一列填充的。我使用外部cmbTransSecondHelper类从数据库中获取数据,然后将DataTable类型返回给WinForm类。 Winform的类中有两个名为DataLoadloadFirstHelper的函数,用于将数据填充到上述组合框,而这些函数在加载表单时正在调用。

现在我要这样做,当我在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;
    }

有什么办法可以解决我的问题?

1 个答案:

答案 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;
}