簡體   English   中英

依賴並動態更改C#WinForm中的組合框值列表

[英]Dependently and Dynamically change Combo Box Value List in C# WinForm

在My C#WinForm中,有兩個comboboxes稱為cmbTransFirstHelpercmbTransSecondHelper 這些組合框是從數據庫中的同一表和同一列填充的。 我使用External DataLoad類從數據庫中獲取數據,然后將DataTable類型返回給WinForm類。 winform類中有兩個函數,分別稱為loadFirstHelperloadSecondHelper ,用於將數據填充到上述組合框,並且這些函數在加載表單時正在調用。

現在,我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();

    }

這些是我的loadFirstHelperloadSecondHelper函數

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM