我正在使用C#,我需要一些帮助。我有DataGridView,我想根据CheckedListBox中的用户选择过滤(显示/隐藏列)。 在CheckedListBox中,我列出了几个项目,这些是DataGridView中的列名: 默认情况下隐藏所有这些列。 CheckedListBox items
现在如果用户选择THERMAL,我想在DataGridView中显示THERMAL Column。如果用户取消选择THERMAL,我想在DataGridView中隐藏THERMAL列。如果用户选择/取消选择多个项目,我想在DataGridView中显示/隐藏所有这些项目。我希望这是有道理的。
以下是我的代码:
private void CLB_SHOW_HIDE_SelectedIndexChanged(object sender, EventArgs e)
{
string col = "";
for (int i = 0; i < CLB_SHOW_HIDE.CheckedItems.Count; i++)
{
if (col == "")
{
col = CLB_SHOW_HIDE.GetItemText(CLB_SHOW_HIDE.CheckedItems[i]);
this.DGV_FEATURE.Columns[col].Visible = true;
}
else
{
col += ", " + CLB_SHOW_HIDE.GetItemText(CLB_SHOW_HIDE.CheckedItems[i]);
this.DGV_FEATURE.Columns[col].Visible = false;
}
}
}
这是问题...如果我删除了else语句,只有当我从下往上时才能正确显示所有列(参见上图)。如果我从顶部到底部,只显示第一个项目。然后我必须取消选择该项目并选择另一个项目才能显示。
如果我在上面的代码中添加了else语句,我就明白了 Error
有人可以对此有所了解吗?
答案 0 :(得分:0)
刚想通了......对于那些可能寻找与此类似的解决方案的人来说,这里是代码:
private void CLB_SHOW_HIDE_SelectedIndexChanged(object sender, EventArgs e)
{
int f = 0;
string qry = "";
for (int i = 0; i < CLB_SHOW_HIDE.Items.Count; i++)
{
if (CLB_SHOW_HIDE.GetItemChecked(i))
{
if (f == 1)
{
qry = CLB_SHOW_HIDE.Items[i].ToString();
this.DGV_FEATURE.Columns[qry].Visible = true;
}
if (f == 0)
{
qry = CLB_SHOW_HIDE.Items[i].ToString();
f = 1;
this.DGV_FEATURE.Columns[qry].Visible = true;
}
}
else
{
qry = CLB_SHOW_HIDE.Items[i].ToString();
this.DGV_FEATURE.Columns[qry].Visible = false;
}
}
}
答案 1 :(得分:0)
You are looking for ItemCheck
event.
For example, let's say, you have added some columns to DataGridView
. Then you can setup checkedListBox
and add column names to it. Also add an event handler to handle ItemCheck
event:
foreach (DataGridViewColumn c in dataGridView1.Columns)
checkedListBox1.Items.Add(c.Name);
checkedListBox1.ItemCheck += CheckedListBox1_ItemCheck;
Then handle ItemCheck
event to show or hide columns:
private void CheckedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
var item = checkedListBox1.GetItemText(checkedListBox1.Items[e.Index]);
dataGridView1.Columns[item].Visible = e.NewValue == CheckState.Checked ? true : false;
}