C#。复选框变为未选中状态

时间:2012-03-21 00:43:34

标签: c# winforms checkbox registry

我有一个问题,我无法解决。 我正在编写一个有助于轻松更改系统代理的应用程序。它有一个带有一些项目的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);
        }
    }

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

2 个答案:

答案 0 :(得分:1)

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

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

    }

真的有点黑客,但效果很好。

答案 1 :(得分:0)

首先从你的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)

当点击断点时(在最后一个索引上),检查该项目与其他项目的不同之处(例如,查看区分大小写)。