我有一个问题,我无法解决。 我正在编写一个有助于轻松更改系统代理的应用程序。它有一个带有一些项目的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(),但我不知道如何以另一种方式解决它。 你能帮我找到一个解决方案,如何取消选中所有其他复选框,或找到一个解决方法来检查正确的项目?
答案 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)
当点击断点时(在最后一个索引上),检查该项目与其他项目的不同之处(例如,查看区分大小写)。