【问题标题】:Check through selected items in CheckedListBox and show/ hide columns based on values selected检查 CheckedListBox 中的选定项目并根据选定的值显示/隐藏列
【发布时间】:2018-10-29 13:52:27
【问题描述】:

我正在使用 C#,我需要一些帮助。我有 DataGridView,我想根据 CheckedListBox 中的用户选择来过滤(显示/隐藏列)。 在 CheckedListBox 中,我列出了一些项目,它们是 DataGridView 中的列名称: 默认情况下,所有这些列都是隐藏的。 CheckedListBox items

现在如果用户选择 THERMAL,我想在 DataGridView 中显示 THERMAL 列。如果用户取消选择 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

谁能解释一下这个问题?

【问题讨论】:

  • 在你的 else 块中 col += ", " + 没有意义。为什么要连接列名,然后使用它在 DataGridView 中查找列
  • True...这没有意义..我应该专注于代码的第一部分以在选择时显示列并且使用我的代码,仅当我从下往上而不是其他方式时才有效周围?

标签: c# winforms datagridview checkedlistbox datagridviewcolumn


【解决方案1】:

刚刚想通了...对于任何可能寻找类似解决方案的人,这里是代码:

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

【讨论】:

    【解决方案2】:

    您正在寻找ItemCheck 事件。

    例如,假设您向DataGridView 添加了一些列。然后您可以设置checkedListBox 并为其添加列名。还要添加一个事件处理器来处理ItemCheck事件:

    foreach (DataGridViewColumn c in dataGridView1.Columns)
        checkedListBox1.Items.Add(c.Name);
    checkedListBox1.ItemCheck += CheckedListBox1_ItemCheck;
    

    然后处理ItemCheck事件来显示或隐藏列:

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

    【讨论】:

    • 您可能已经使用您在此处共享的解决方案解决了问题。但我建议将解决方案更改为我在这篇文章中分享的内容。您还应该知道SelectedIndexChanged 将通过选择一个项目来提高,而用户需要在项目附近放置复选标记。 Checking 一个项目与Selecting 完全不同。通过选择该项目以蓝色突出显示,而它可能未被选中。
    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多