2012-03-21 64 views
0

我有一個問題,我無法解決。 我正在編寫一個應用程序,它可以幫助您輕鬆更改系統代理。它有一個listView與一些項目。這些項目有複選框。中,只有一個項目可以同時檢查應用需求 邏輯,所以我下面的代碼,以確保它工作得很好:C#。複選框變得沒有選中

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

這沒有多大意義。您已經知道如何取消訂閱ItemChecked事件,以便可以在GetProxyFromRegistry中工作。但首先要創建一個更直觀的用戶界面。 – 2012-03-21 00:53:46

+0

用戶界面不能更直觀。我不知道如何在特定時刻取消訂閱此事件(方法)。你可以請舉個例子嗎? – artman 2012-03-21 00:59:02

+2

它在你自己的代碼!您的ItemChecked事件處理程序的第一行。 – 2012-03-21 01:02:11

回答

0

所以你ItemCheck事件開始,它應該是這樣的:

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

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

在接下來的問題,我建議你在這行代碼在這裏設置斷點當命中斷點時(在最後一個索引處),檢查該項與其他項相比有什麼不同(例如,查看區分大小寫)。

+0

不好的建議。它也在代碼設置Checked屬性時運行。 – 2012-03-21 01:05:11

+0

@HansPassant顯然我錯了!我已經反映,謝謝。 – Lander 2012-03-21 01:10:47

+0

非常感謝!有用! – artman 2012-03-21 01:15:50

1

這可能是一個簡單的解決方案,只有一次使用一個複選框,但它適用於我。創建一個listview.click事件,然後執行以下操作:

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

    } 

真的有點破綻,但效果很好。

+0

對不起,對此的修改;我也有一個listview.lostfocus方法,然後我把我的檢查值變量。 – Clive 2012-06-11 21:55:08