【问题标题】:C#. Checkboxes become uncheckedC#。复选框变为未选中状态
【发布时间】:2012-06-12 05:52:06
【问题描述】:

我有一个问题,我无法解决。 我正在编写一个有助于轻松更改系统代理的应用程序。它有一个包含一些项目的 listView。这些项目有复选框。 应用程序的逻辑要求一次只能检查一项,所以我有以下代码来确保它运行良好:

    private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e)
    {
        listView1.ItemChecked -= listView1_ItemChecked;
        foreach(ListViewItem item in listView1.Items)
        {
            if(item != e.Item)
            {
                item.Checked = false;
            }
        }
        listView1.ItemChecked += listView1_ItemChecked;
    }

我的应用程序还需要在启动时检查注册表中的某些值,并将其文本与我在 listView 中的项目进行比较。 我就是这样做的:

    private void GetProxyFromRegistry()
    {
        RegistryKey SystemProxy = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings");
        try
        {
            string UsedProxy = SystemProxy.GetValue("ProxyServer").ToString();
            foreach (ListViewItem item in listView1.Items)
            {
                if (UsedProxy == item.Text + ":" + item.SubItems[1].Text)
                {
                    item.Checked = true;
                }
                else
                {
                    item.Checked = false;
                }

            }
        }
        catch (Exception exc) 
        {
            MessageBox.Show(exc.Message);
        }
    }

问题在于,除了 last 一个使用时,不会检查任何 listView1.Items。 我知道这是因为 listView1_ItemChecked(),但我不知道如何以其他方式解决它。 你能帮我找到一个解决方案,如何取消选中所有其他复选框,或者找到一种解决方法来检查正确的项目吗?

【问题讨论】:

  • 这没有多大意义。您已经知道如何取消订阅 ItemChecked 事件,这样它也可以在 GetProxyFromRegistry 中工作。但首先要创建一个更直观的用户界面。
  • 用户界面再直观不过了。我不知道如何在特定时刻(方法)取消订阅此事件。可以给我举个例子吗?
  • 在您自己的代码中!您的 ItemChecked 事件处理程序的第一行。

标签: c# winforms checkbox registry


【解决方案1】:

这可能是一个简单的解决方案,一次只使用一个复选框,但它适用于我。创建一个 listview.click 事件,然后执行以下操作:

    private void listView_Click(object sender, System.EventArgs e)
    {
        foreach (ListViewItem item in listView.Items)
        {
            item.Checked = false;
        }

    }

确实有点破解,但效果很好。

【讨论】:

  • 抱歉,修改一下;我还有一个 listview.lostfocus 方法,然后我将选中的值抓取到一个变量中。
【解决方案2】:

所以从你的 ItemCheck 事件开始,它应该是这样的:

void listView1_ItemCheck(object sender, ItemCheckEventArgs e)
{
        if (e.currentValue == CheckState.Checked)
            return;
        foreach (ListViewItem item in listView1.Items)
        {
            if (item.Index != e.Index)
            {
                item.Checked = false;
            }
        }
}

对于下一个问题,我建议在这里的这行代码设置一个断点:

   if (UsedProxy == item.Text + ":" + item.SubItems[1].Text)

当断点被击中时(在最后一个索引上),检查该项目与其他项目相比有何不同(例如,注意区分大小写)。

【讨论】:

  • 不好的建议。它也会在代码设置 Checked 属性时运行。
  • @HansPassant 显然我错了!我已经反映了这一点,谢谢。
猜你喜欢
  • 2021-02-26
  • 1970-01-01
  • 2018-01-09
  • 2023-03-21
  • 2015-11-28
  • 2016-06-19
  • 2013-10-04
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多