【问题标题】:Change state of checkbox by Listbox items selection c#通过列表框项目选择c#更改复选框的状态
【发布时间】:2020-11-23 13:43:45
【问题描述】:

我有一个 listboxnamed (lstClass) 填充了数据库项目。我想更改位于listbox 之外的名为 (cbSelectAll) 的checkbox 的状态。我希望这些点在代码中实现,

  1. 加载表单时,复选框应设置为false
  2. 当我从列表框中选择多个项目(未完成项目)时,复选框状态应更改为Intermediate
  3. 当我从列表框中选择完整的项目时,复选框状态应更改为True
  4. 当我单击复选框时,如果其状态为true,则列表框中应选择所有项。
  5. 当我点击复选框时,如果它的状态是false 那么no项应该在列表框中被选中。

表格代码如下:-

public partial class frmSelectClass : Form
{
    private DataTable dTable;
    
    public frmSelectClass(DataTable table)
    {
        InitializeComponent();
        this.dTable = table;
    }

    private void frmSelectClass_Load(object sender, EventArgs e)
    {
        Retrieving_SheetNames();
    }

    private void Retrieving_SheetNames()
    {
        List<string> lstSheets;
        // Get sheet names from excel
        List<string> lstSheetsEx = dTable.AsEnumerable()
                   .Select(r => r.Field<string>("TABLE_NAME").Trim(new char[] { '\'', '$' })).ToList();
        using (var conn = new OleDbConnection(DatabaseObjects.ConnectionString))
        {
            using (OleDbCommand command = new OleDbCommand("select * from Classes", conn))
            {
                conn.Open();
                DataTable dtClassDb = new DataTable();
                dtClassDb.Load(command.ExecuteReader());
                // Get sheet names from Access DB
                List<string> lstSheetsdb = dtClassDb.AsEnumerable().Select(c => c.Field<string>("Class")).ToList();
                // Order sheet names according to DB
                lstSheets = lstSheetsdb.Intersect(lstSheetsEx).Union(lstSheetsEx).ToList();
            }
        }
        lstClass.DataSource = lstSheets;
    }
   
    private void cbSelectAll_CheckedChanged(object sender, EventArgs e)
    {
        if (cbSelectAll.Checked)
        {
            for (int i = 0; i < lstClass.Items.Count; i++)
            {
                lstClass.SetSelected(i, true);
            }
            return;
        }
        for (int i = 0; i < lstClass.Items.Count; i++)
        {
            lstClass.SetSelected(i, false);
        }
    }
}

【问题讨论】:

    标签: c# winforms checkbox listbox


    【解决方案1】:

    您可以为ListBox 处理SelectedValueChanged 事件,如下所示:

    private void lstClass_SelectedValueChanged(object sender, EventArgs e)
    {
        cbSelectAll.CheckedChanged -= cbSelectAll_CheckedChanged;
        if (lstClass.SelectedItems.Count == 0)
            cbSelectAll.CheckState = CheckState.Unchecked;
        else if (lstClass.SelectedItems.Count == lstClass.Items.Count)
            cbSelectAll.CheckState = CheckState.Checked;
        else
            cbSelectAll.CheckState = CheckState.Indeterminate;
        cbSelectAll.CheckedChanged += cbSelectAll_CheckedChanged;
    
    }
    

    【讨论】:

    • 这对我有用。选中复选框时,它单击其状态更改为 Indeterminate 但列表框选定项中没有任何反应。仍然选择了所有项目。
    • 您希望这些物品会发生什么?
    • 不确定状态意味着没有选择所有项目,这就是我想要的
    • 如果您将ThreeState 设置为false,您将无法通过单击将cbSelectAll 置于不确定状态。我从答案中删除了最后一句话:)
    • frmSelectClass_Load 中致电lstClass.SelectedItems.Clear()
    猜你喜欢
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2023-03-31
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    相关资源
    最近更新 更多