2011-08-31 18 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

私が間違って何をしているのですか?

EDIT:明らかに、私の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); 
} 

しかし、私が持っているあなたがそうあなたが現在の仕事を持っているコードを作るために、それを行うとき、ちょうど描画モードを変更する動作しませんToStringメソッドをオーバーライド

ComboBoxコレクション内にUserControlを置くことがこれを行う最善の方法であるかどうかはわかりません。私は真剣にそれを異なってリファクタリングを検討します。

+0

ちょっとした問題があります。これは、DropDownStyleがDropDownList(これは私がとにかく必要なもの)である場合にのみ機能します。それ以外の場合は、リストが表示されますが、実際に選択された項目は空白になります。また、 'Brushes.Black'の代わりに'新しいSolidBrush(e.ForeColor) 'を使用しました。あなたは恩恵を受ける。 –

0

コンボボックスに追加する項目は、メッセージボックスと同様に文字列である必要があります。

試してみてください。私はあなたのコードの権利を読んでいる場合

this.cboFields.DisplayMember = "ToString()"

+0

解決策の問題は、 'this.cboFields.SelectedItem'がFieldオブジェクトではなく文字列を返すことです。これは動作しません。 –

+1

Hmn、面白いです。 [ここ](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

関連する問題