2017-12-21 26 views
-1

Windowsフォームのコンボボックスにチェックボックスを追加します。チェックボックスの追加と私はアイテムとしてそれらを選択することができますが、私はチェックボックスのテキストを見ることができます。コンボボックスのドロップダウンでは、選択されたアイテムを受け取るときに、アイテムは空のリストになり、正しい詳細を特定する。コンボボックスにチェックボックスを追加すると、ドロップダウンに表示されません。

ボックスと名前を表示するにはどのように見えるようにしますか?

+0

コードを入れてください! –

+0

//新しいチェックボックスを作成 var comJect = new CheckBox(); //チェックボックスプロパティの定義 comJect.Name = headItem; comJect.Text = headItem; this.Controls.Add(comJect); dllMethodParameters.Controls.Add(comJect); dllMethodParameters.Items.Add(comJect); –

+0

dllMethodParameters.Controls.Add(comJect [Depth]); このステートメントは、コントロールにチェックボックスを追加しますが、ドロップダウンリストは追加しません。 –

答えて

0

独自のユーザーコントロールを作成する必要があります。

using System; 
using System.Windows.Forms; 

namespace WindowsFormsApp1 
{ 
    public partial class CheckComboBox : ComboBox 
    { 
     public CheckComboBox() 
     { 
      this.DrawMode = DrawMode.OwnerDrawFixed; 
     } 
    } 
} 

あなたは私たちは、ドロップダウンリストの項目自分自身をレンダリングする予定のComboBoxを伝えるために描画モードのプロパティを設定する必要があります:最初のステップは、サブクラスにSystem.Windows.Forms.ComboBoxクラスを作成することです。次のステップは、ドロップダウンリスト項目データを含むクラスを定義して状態を維持することでした。

namespace WindowsFormsApp1 
{ 
    public class CheckComboBoxItem 
    { 
     public CheckComboBoxItem(string text, bool initialCheckState) 
     { 
      _checkState = initialCheckState; 
      _text = text; 
     } 

     private bool _checkState = false; 
     public bool CheckState 
     { 
      get { return _checkState; } 
      set { _checkState = value; } 
     } 

     private string _text = ""; 
     public string Text 
     { 
      get { return _text; } 
      set { _text = value; } 
     } 

     public override string ToString() 
     { 
      return "Select Options"; 
     } 
    } 
} 

それはあなたのCheckComboBox.csに戻って代表者DrawItemSelectedIndexChangedイベントを追加した後:これは単純なクラスです。 DrawItemsデリゲートで

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.VisualStyles; 

namespace WindowsFormsApp1 
{ 
    public partial class CheckComboBox : ComboBox 
    { 
     public event EventHandler CheckStateChanged; 

     public CheckComboBox() 
     { 
      this.DrawMode = DrawMode.OwnerDrawFixed; 
      this.DrawItem += new DrawItemEventHandler(CheckComboBox_DrawItem); 
      this.SelectedIndexChanged += new EventHandler(CheckComboBox_SelectedIndexChanged); 
     } 

     void CheckComboBox_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      if (e.Index == -1) 
      { 
       return; 
      } 

      if (!(Items[e.Index] is CheckComboBoxItem)) 
      { 
       e.Graphics.DrawString(
       Items[e.Index].ToString(), 
       this.Font, 
       Brushes.Black, 
       new Point(e.Bounds.X, e.Bounds.Y)); 
       return; 
      } 

      CheckComboBoxItem box = (CheckComboBoxItem)Items[e.Index]; 

      CheckBoxRenderer.RenderMatchingApplicationState = true; 
      CheckBoxRenderer.DrawCheckBox(
      e.Graphics, 
      new Point(e.Bounds.X, e.Bounds.Y), 
      e.Bounds, 
      box.Text, 
      this.Font, 
      (e.State & DrawItemState.Focus) == 0, 
      box.CheckState ? CheckBoxState.CheckedNormal : 
       CheckBoxState.UncheckedNormal); 
     } 

     void CheckComboBox_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      CheckComboBoxItem item = (CheckComboBoxItem)SelectedItem; 
      item.CheckState = !item.CheckState; 
      CheckStateChanged?.Invoke(item, e); 
     } 
    } 
} 

は、まず最初にすることは、私たちがレンダリングされている項目がCheckComboBoxItemとして追加されたことを確認することです。そうでない場合は、単純な文字列としてレンダリングします。それ以外の場合は、DrawItemEventArgs.Indexプロパティを使用してItemsコレクションから適切なCheckComboBoxItemを取得します。次にCheckBoxRenderer.DrawCheckBox()メソッドを呼び出し、CheckBoxをレンダリングするGraphicsオブジェクトと、位置、サイズ、テキスト、フォント、フォーカス、およびチェック状態を渡します。 2番目の方法では、ドロップダウンのチェックボックスを切り替えることができますが、このコントロールのユーザーは何か問題が発生したことを知ることはできません。だから我々はまた、ドロップダウンリストの項目のチェック状態への変化のコントロールのユーザーに通知する公開イベントを追加します。

最後に
public event EventHandler CheckStateChanged; 

、あなたがこのコントロールを使用する場合は、デフォルトのForm1にあなたのアプリケーションのタイプは次のようになります:

using System; 
using System.Windows.Forms; 

namespace WindowsFormsApp1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      checkComboBox1.Items.Add(new CheckComboBoxItem("One", true)); 
      checkComboBox1.Items.Add(new CheckComboBoxItem("Two", true)); 
      checkComboBox1.Items.Add(new CheckComboBoxItem("Three", true)); 

      this.checkComboBox1.CheckStateChanged += new EventHandler(this.checkComboBox1_CheckStateChanged); 
     } 

     private void checkComboBox1_CheckStateChanged(object sender, EventArgs e) 
     { 
      if (sender is CheckComboBoxItem) 
      { 
       CheckComboBoxItem item = (CheckComboBoxItem)sender; 
      } 
     } 
    } 
} 

あなたには役に立つリンクがたくさんあります。あなたは

https://www.codeproject.com/Articles/31105/A-ComboBox-with-a-CheckedListBox-as-a-Dropdown

https://www.codeproject.com/Articles/21085/CheckBox-ComboBox-Extending-the-ComboBox-Class-and

https://www.codeproject.com/Articles/18929/An-OwnerDraw-ComboBox-with-CheckBoxes-in-the-Drop

が私を修正するためにあなたの@Robと@Mamunをありがとう...私たちはあなたが必要とする内容を正確に把握していない任意のコードを入れてはいけません。

+0

ソリューションへのリンクは歓迎しますが、あなたの答えがそれなしで有用であることを確認してください:[リンクの前後にコンテキストを追加する](// meta.stackexchange。com/a/8259)、あなたの仲間のユーザーは、それが何であるか、なぜそれがあるのか​​を知って、ターゲットページが利用できない場合にリンクしているページの最も関連性の高い部分を引用します。 [リンクよりも少しだけ回答が削除される可能性があります](// stackoverflow.com/help/deleted-answers) – Rob

+0

このリンクは質問に答えるかもしれませんが、ここでは答えの重要な部分を含めることをお勧めします参照のためのリンク。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 18703794) – Mamun

関連する問題