2012-03-21 11 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; 
    } 

また、私のアプリケーションがそれにレジストリにいくつかの値をチェックする必要が開始と比較していますリストビュー内のアイテムを持つテキストです。 私はそのようにそれをやっている:

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のいずれも使用最後 1以外にチェックされませんということです。 私はそれがlistView1_ItemChecked()のためだと知っていますが、私はそれを他の方法で解決する方法がわかりません。 他のチェックボックスをすべてオフにする方法や、正しい項目を確認するための回避策を見つける方法を教えてください。

+0

これはあまり意味がありません。 GetProxyFromRegistryでも機能するように、ItemCheckedイベントの購読を解除する方法はすでに知っています。しかしより直観的なユーザーインターフェイスを作成してください。 –

+0

ユーザーインターフェイスを直観的にすることはできませんでした。私は特定の瞬間(方法)のためにこのイベントをどのように退会させるのか分かりません。私に例を挙げてください。 – artman

+2

あなた自身のコードです! ItemCheckedイベントハンドラの最初の行。 –

答えて

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) 

ブレークポイントがヒットしたら(最後のインデックスで)、他のアイテムと比較してそのアイテムの相違点を確認します(たとえば、大文字と小文字の区別を見てください)。

+0

悪いアドバイス。コードがCheckedプロパティを設定するときにも実行されます。 –

+0

@HansPassant明らかに私は間違っていた!私はそれを反映しました、ありがとう。 – Lander

+0

ありがとうございます!できます! – artman

1

これは、一度に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

関連する問題