2016-05-19 13 views
0

次のようなComboBoxがあり、ヘッダーセクションをクリックしたときに閉じないようにします()。アイテムが選択されたときにコンボボックスが閉じるのを防ぐ方法

enter image description here

私は、次のコードを試してみました。

private void cmboName_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (cmboName.SelectedIndex == 1) 
     { 
      cmboName.DroppedDown = true; 
      return; 
     } 
    } 

しかし、震えが起こります。最初のコンボボックスが閉じられ、次に開きます。

+4

あなたはどのUIフレームワークを使用していますか? WinFormsまたはWPF? –

+0

私はWinFormsを使用しています –

+0

追加情報で質問を更新するだけで、コメントに追加しないでください – MikeT

答えて

0

更新

何をする必要がComboBoxをするとき、それはいけないドロップダウンを閉じたいシステムを通知するメッセージを抑制することです。私のテストは無効/非選択のグループ化/ヘッダ項目の簡単なチェックを使用しています

public partial class myComboBox : ComboBox 
{ 
    public myComboBox() 
    { 
     InitializeComponent(); 
    } 

    private int direction = 0; // where to jump when when doing keyboard selection 
    private int lastIndex = -1; 

    private void skip() 
    { 
     if (direction > 0 && (SelectedIndex + 1 < Items.Count)) 
      SelectedIndex += 1; 
     else if (direction < 0 && (SelectedIndex - 1 >= 0)) 
      SelectedIndex -= 1; 
     else SelectedIndex = lastIndex; 

    } 

    // optional, but you are owner-drawing anyway.. 
    protected override void OnPaint(PaintEventArgs pe) 
    { 
     base.OnPaint(pe); 
    } 

    // use your own logic to determine which entries can be selected! 
    bool Invalid(int index) 
    { 
     return index < 0 ? true 
         : (Items[index].ToString().StartsWith("X")); 
    } 

    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Up) direction = -1; 
     else if (e.KeyCode == Keys.Down) direction = 1; 
     else direction = 0; 
    } 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x111) /* WM_COMMAND */ 
     { 
      if (((int)m.WParam >> 16) == 1) 
      { 
       if (Invalid(SelectedIndex)) 
       { 
        while (Invalid(SelectedIndex)) skip(); // skip invalid entries 
        m.Result = new IntPtr(1); // return success 
        return;     // consume the message 
       } 
       lastIndex = SelectedIndex; 
      } 
     } 
     base.WndProc(ref m); 
    } 

    } 
} 

注:サブクラスを作成する必要があることを行うには

。コンテンツが「X」であることを確認する代わりに、あなた自身の適切なチェックを使用する必要があります!おそらくItemDrawイベントでこれらの項目を太字で表示するのと同じ条件です。

+0

選択した変更イベントのコードは、自分のコードと同じに動作します。リストビューを邪魔することなく維持できますか? –

+0

それは私の最後の文で私が意味するものです。私はそれを試していない。おそらく、WndProcは私の強い側ではありません。キーボードを使用しているときにThコードが正常に動作しますが、間違った項目をクリックするとちらつきが発生します。 – TaW

+0

ok ..これはキーボードでうまくいきます。私は本当にあなたがそれに取り組んでいることを知ってうれしいです... –

0

1つの解決策は、選択から一部の項目を無効にすることです。
はこれを試してみてください:

private void Form1_Load(object sender, EventArgs e) 
     { 
      comboBox1.DrawMode = DrawMode.OwnerDrawFixed; 
     } 

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      string itemText = comboBox1.GetItemText(comboBox1.SelectedItem); 

      if ((itemText == "Admins") || (itemText == "Users"))    
       comboBox1.SelectedIndex = -1; 
     } 

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      string itemText = comboBox1.GetItemText(comboBox1.Items[e.Index]); 

      if ((itemText == "Admins") || (itemText == "Users")) 
      { 
       using (var f = new Font("Microsoft Sans Serif", 8, FontStyle.Bold)) 
        e.Graphics.DrawString(itemText, f, Brushes.Black, e.Bounds); 
      } 
      else 
      { 
       e.DrawBackground(); 

       using (var f = new Font("Microsoft Sans Serif", 8, FontStyle.Regular)) 
        e.Graphics.DrawString(itemText, f, Brushes.Black, e.Bounds); 

       e.DrawFocusRectangle(); 
      } 
     } 

それはあなたが望むものではありませんが、それは次善の策です。

関連する問題