通过列表框项目选择更改复选框的状态 c#
Change state of checkbox by Listbox items selection c#
我有一个 listbox
名为 (lstClass) 的数据库项目。我想更改位于 listbox
之外的名为 (cbSelectAll) 的 checkbox
的状态。我希望这些点在代码中实现,
- 加载表单时,复选框应设置为
false
。
- 当我从列表框中 select 多个项目(不完整的项目)时,复选框状态应更改为
Intermediate
。
- 当我 select 完成列表框的项目时,复选框状态应更改为
True
。
- 当我点击复选框时,如果它的状态是
true
那么 所有 项目应该 select 在 ListBox 中编辑。
- 当我点击复选框时,如果它的状态是
false
那么 没有 项目应该 select 在列表框中编辑。
表格代码如下:-
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);
}
}
}
您可以像这样处理 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;
}
我有一个 listbox
名为 (lstClass) 的数据库项目。我想更改位于 listbox
之外的名为 (cbSelectAll) 的 checkbox
的状态。我希望这些点在代码中实现,
- 加载表单时,复选框应设置为
false
。 - 当我从列表框中 select 多个项目(不完整的项目)时,复选框状态应更改为
Intermediate
。 - 当我 select 完成列表框的项目时,复选框状态应更改为
True
。 - 当我点击复选框时,如果它的状态是
true
那么 所有 项目应该 select 在 ListBox 中编辑。 - 当我点击复选框时,如果它的状态是
false
那么 没有 项目应该 select 在列表框中编辑。
表格代码如下:-
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);
}
}
}
您可以像这样处理 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;
}