2017-12-21 3 views
-1

windowsform의 comboBox에 체크 박스를 추가하고 있습니다. 체크 박스 add와 아이템으로 선택할 수 있지만 진드기 상자의 텍스트를 볼 수 있습니다. 콤보 박스 드롭 다운에서 항목은 비어 있고 선택한 항목을 수신 할 때 정확한 세부 정보를 클릭합니다.드롭 다운에 보이지 않는 comboBox에 체크 박스 추가하기

상자와 이름을 표시하려면 어떻게해야합니까?

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

당신은 우리가 드롭 다운 목록 항목 자신을 렌더링하고자하는 콤보를 이야기하는 DrawMode 속성을 설정해야합니다 : 첫 번째 단계는 서브 클래스에게 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을 가져옵니다. 그런 다음 CheckBox를 렌더링하려는 Graphics 객체, 위치, 크기, 텍스트, 글꼴, 포커스 및 체크 상태를 전달하여 CheckBoxRenderer.DrawCheckBox() 메서드를 호출합니다. 두 번째는 드롭 다운의 확인란을 토글 할 수 있지만이 컨트롤의 사용자는 아무 일도 일어나지 않았 음을 알 수 없습니다. 기본 Form1에, 당신은이 컨트롤을 사용하려면,

public event EventHandler CheckStateChanged; 

마지막 : 그래서 우리는 또한 드롭 다운 목록에서 항목의 체크 상태로 변화의 컨트롤의 사용자에게 알릴 수있는 공개 이벤트를 추가 응용 프로그램에 다음 코드를 입력하십시오 :

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/18929/An-OwnerDraw-ComboBox-with-CheckBoxes-in-the-Drop

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

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

저를 정정하는 당신에게 @ 롭과 @Mamun 감사 ... 그래서 우리는 당신이 필요로 정확히 알고하지 않는 코드를 삽입하지 않습니다.

+0

솔루션에 대한 링크는 환영하지만, 답이 없으면 답이 유용하다는 것을 확인하십시오. [링크 주변에 컨텍스트 추가] (// meta.stackexchange.co.kr/a/8259) 동료 사용자가 자신이 무엇인지, 그 이유가 무엇인지 생각해보고 대상 페이지를 사용할 수없는 경우 연결할 페이지의 가장 관련있는 부분을 인용하십시오. [링크 이상인 답변은 삭제 될 수 있습니다.] (// stackoverflow.com/help/deleted-answers) – Rob

+0

이 링크가 질문에 대답 할 수 있지만 여기에 답변의 핵심 부분을 포함시키고 참조 용 링크. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. - [리뷰에서] (리뷰/저품절 게시물/18703794) – Mamun

관련 문제