检查CheckedListBox中的选定项目,并根据所选值显示/隐藏列

时间:2018-05-19 07:27:34

标签: c# winforms datagridview checkedlistbox datagridviewcolumn

我正在使用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

有人可以对此有所了解吗?

2 个答案:

答案 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;
}