2017-05-28 13 views
0

私は通常、物事を把握していますが、これは私を打ち負かすものです。C#選択された値を使用したリストボックス

私はフォームと送信ボタンのリストボックスの配列を持っています。ユーザーは任意のリストボックスからアイテムを選択し、サブミットボタンをクリックしてアイテムを確定することができますが、リストボックス1から何かを選択してリストボックス2から何かを選択すると、リストボックスで選択されたアイテム1は選択されなくなるはずです。

これをイベントハンドラにコーディングすることはできますが、別のリストボックスの値を変更すると、プログラムによって別のイベントが発生します。私はそれから論理を出すことができない。

私はちょうど複数の送信ボタンを置く必要があると思います。

EDIT:

私は最終的には非常に明白かつ簡単な解決策と思われるものを考え出しました。ユーザーまたはプログラムが変更を行っているかどうかを区別するために、フォーカスされたプロパティを使用しました。マウスとキーボードの両方の選択に対応しています。提案のため

おかげで...私のイベントハンドラがフラグをチェックし、行動を取ることができないので、

for (int i = 0; i < treatments.Length; i = i + 1) 
     { 
      this.Controls.Add(ListBoxes[i]); 
      this.Controls.Add(Labels[i]); 
      this.Controls.Add(Spinners[i]); 

      Labels[i].Top = vPosition - 20; 
      Labels[i].Left = hPosition; 
      Labels[i].Width = 600; 

      ListBoxes[i].Left = hPosition; 
      ListBoxes[i].Top = vPosition; 
      ListBoxes[i].Width = 600; 

      Spinners[i].Top = vPosition + ListBoxes[i].Height; 
      Spinners[i].Left = hPosition + ListBoxes[i].Width - 60; 
      Spinners[i].Width = 40; 
      for (int d = 25; d > 0; d = d - 1) { Spinners[i].Items.Add((d).ToString()); } 
      Spinners[i].SelectedIndex = 24; 



      //EVENT HANDLER CODE that is executed if any selectetindexchange in any LIstbox in array 
      ListBoxes[i].SelectedIndexChanged += (sender, e) => 
       { 


        for (int s = 0; s < i; s = s + 1) 

        { 
         //FIND WHICH LBs[s] IS THE SENDING LISTBOX 
         if (ListBoxes[s] == sender && ListBoxes[s].Focused == true) 
         { 
          string msg = "sender is ListBox " + s.ToString() + "\nFocus is" + ListBoxes[s].Focused.ToString(); 
          // MessageBox.Show(msg); 
         } 
         else if(ListBoxes[s].Focused==false) 
         { 
          ListBoxes[s].SelectedIndex = -1; 
         }       


        } 


       }; //end of event handler 

} 
+0

はWinformsの、WebフォームまたはMVCプロジェクトですか? – hardkoded

+0

いつでもフラグを使用できます。 –

+0

この質問は似ており、答えは一般的な戦略まで適用されるかもしれません:[C#でイベントをトリガーせずにコンボボックスSelectedIndexを変更する](https://stackoverflow.com/questions/3356518/modifying-combobox-selectedindex-without-トリガーイベントをCシャープにする) – hatchet

答えて

0

私は一般的に、私は物事を変えていますということを知ることができますフラグを持つこの種の問題を解決しますその場合は。

private int codeChangingCount = 0; 
private void combobox1_SelectedIndexChanged(object sender, EventArgs e) { 
    codeChangingCount++; 
    try { 
     combobox2.SelectedIndex = someNewValue; 
    } finally { 
     codeChangingCount--; 
    } 
} 

private void combobox2_SelectedIndexChanged(object sender, EventArgs e) { 
    if (codeChangingCount == 0) { 
     //I know this is changing because of the user did something, not my code above 
    } 
} 

代わりintの簡単なboolでこれを行うことができますが、私は誤ってそれをリセットし、ネストされた呼び出しでcodeChangingCountをインクリメントし続けるとできないように、私はカウンターのアプローチが好きです。私のプロダクションコードでは、この種のフラグ付けに専念したクラスがありますが、IDisposableを使用してデクリメントするため、usingブロックで呼び出しをラップすることはできますが、上記のスニペットは簡単です。もし

+0

私はこのアプローチを試みましたが、私は多くのリストボックスのためにループとイベントハンドラを使用していた方法で動作させることができませんでした。 – user8078868

0

チェック重視のListBox == ListBox2とSelectedIndexを> -1その後、インデックスの選択を解除する[0]

if (ListBoxes[s] == sender && ListBoxes[s].Focused == true) 
    { 
     if(s == 1 && ListBoxes[s].SelectedIndex > -1) //assuming 1 is listbox2 
     { 
      ListBoxes[0].SelectedIndex = -1; // Deselect ListBox1 
     } 
     string msg = "sender is ListBox " + s.ToString() + "\nFocus is" + ListBoxes[s].Focused.ToString(); 
    } 
関連する問題