Изменить состояние флажка при выборе элементов Listbox c# - PullRequest
1 голос
/ 03 августа 2020

У меня есть listbox named ( lstClass ), заполненный элементами базы данных. Я хочу изменить состояние checkbox named ( cbSelectAll ), расположенного за пределами listbox. Я хочу, чтобы эти точки были реализованы в коде,

  1. При загрузке формы флажок должен быть установлен на false.
  2. Когда я выбираю несколько элементов (Не полные элементы) из списка , Состояние флажка следует изменить на Intermediate.
  3. Когда я выбираю полные элементы из списка, состояние флажка должно быть изменено на True.
  4. Когда я нажимаю флажок, если его состояние true, затем все элементы должны быть выбраны в ListBox.
  5. Когда я устанавливаю флажок, если его состояние false, то no элементы должны быть выбраны в Listbox .

Код для формы находится под: -

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);
        }
    }
}

1 Ответ

1 голос
/ 03 августа 2020

Вы можете обработать событие SelectedValueChanged для ListBox примерно так:

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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...