2011-08-31 8 views
1

ComboBox를 채우는 데 사용하려고하는 다음 코드가 있지만 추가 할 개체의 실제 텍스트가 표시되지 않습니다.ComboBox에 텍스트가 표시되지 않습니다.

internal partial class SortBox : UserControl { 
    private Field[] FieldReferences 
    ... 
    internal Field[] Fields { 
     ... 
     set { 
      this.FieldReferences = value; 
      this.cboFields.Items.Clear(); 
      string NoneString = "(none)"; 
      this.cboFields.Items.Add(NoneString); 
      this.cboFields.SelectedItem = NoneString; 
      foreach (Field Field in this.FieldReferences) { 
       MessageBox.Show(Field.ToString()); // <- This displays what I want displayed perfectly. 
       this.cboFields.Items.Add(Field); 
      } 
     } 
    } 
    ... 
} 

public partial class Field : UserControl { 
    protected string LabelValue; 
    ... 
    public override string ToString() { 
     return this.LabelValue; 
    } 
} 

내가 얻은 것은 다음과 같습니다. 그들은 모두 빈 위치 : 내가 무슨 일을

Screenshot

을하고 있는가?

편집 : 필자의 Field 클래스는 UserControl에서 상속됩니다. 몇 가지 테스트를했는데 클래스가 System.ComponentModel.Component에서 상속한다는 사실과 관련이있는 것 같습니다.

답변

1

, 당신이하려고 밖에 toString 이미 기본해야하지만 this.cboFields.Items.Add(Field.ToString());

또는, 당신의 DisplayMember 필드 설정을 시도 할 수 있습니다 콤보 상자 안에 사용자 정의 컨트롤 넣기.

이 작동 :

cboFields.DrawMode = DrawMode.OwnerDrawFixed; 
cboFields.DrawItem += new DrawItemEventHandler(cboFields_DrawItem); 

private void cboFields_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 
    if (e.Index > -1) 
    e.Graphics.DrawString(cboFields.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds); 
} 

하지만에있는 당신은 그래서 당신은 현재 일이 코드를 만들기 위해, 그렇게 할 때, 단지 DrawMode을 변경 작동하지 않습니다 있으며, toString를 오버라이드 (override)

ComboBox 컬렉션에 UserControl을 배치하는 것이 가장 좋은 방법인지는 모르겠다. 나는 심각하게 리팩토링을 다르게 고려할 것이다.

+0

몇 가지 사소한 문제가 있습니다. DropDownStyle이 DropDownList 인 경우에만 작동합니다 (어쨌든 내가 필요로하는 것임). 그렇지 않으면 목록이 채워지지만 실제로 선택한 항목은 비어있게됩니다. 또한,'Brushes.Black' 대신'새로운 SolidBrush (e.ForeColor) '를 사용했습니다. 현상금을 받는다. –

0

콤보 상자에 추가하는 항목은 메시지 상자와 마찬가지로 문자열이어야합니다.

시도 : 나는 당신의 코드 권리를 읽고 있습니다 경우

this.cboFields.DisplayMember = "ToString()"

+0

이 솔루션의 문제점은 'this.cboFields.SelectedItem'이 Field 객체 대신 문자열을 반환한다는 것입니다. 이것은 작동하지 않습니다. –

+1

Hmn, interesting. [here] (http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.items.aspx)에 따르면 ToString을 재정의하는 한 적절한 텍스트가 표시되어야합니다. 코드 샘플의 이전 줄에 따라 이미 완료했습니다. [DisplayMember] (http://msdn.microsoft.com/en-us/library/system.windows.forms.listcontrol.displaymember.aspx)도 설정해보십시오. – Hannele

+0

"this.cboFields.SelectedItem은 문자열을 반환합니다 ..."=> Hannele은 올바른 해결책을 조언했으며 Field Type을 사용하려면 Field의 새 인스턴스를 만들어야합니다. – ARZ

관련 문제