2010-09-08 148 views
4

我在使用ComboBox時遇到一些問題。C#組合框覆蓋ToString

爲我的組合框的顯示部件沒有被類MAP的重寫的ToString方法填充。

這裏是我的代碼:

Form1.cs中:

private void Form1_Load(object sender, EventArgs e) { 
    ... 
    ...  
    MAPList MAP = new MAPList(); 
    comboBox1.DataSource = MAP.All; 
    comboBox1.ValueMember = "Code"; 
    ... 
    ... 
} 

MAPList.cs:

public class MAPList { 
    public readonly List<MAP> All; 

    public MAPList() { 
     All = new List<MAP>(); 

     var MapData = // Getting map data 

     foreach(MAP m in MapData) { 
      All.Add(new Map(m.Name, m.Code)); 
     } 
    } 
} 

MAP.cs:

public class MAP { 
    public readonly string Name; 

    private string code; 
    public string Code { get { return code; } } 

    public RadioCode(string Name, string Code) { 
     this.Name = Name; 
     this.code = Code; 
    } 

    public override string ToString() { 
     return String.Format("{0}: {1}", Name, Code); 
    } 
} 
+0

什麼是關係?我沒有看到你在任何地方調用對象映射 – vodkhang 2010-09-08 05:54:00

+0

那麼顯示什麼呢?只是「MAP」? – 2010-09-08 05:57:30

+0

您正在將ValueMember設置爲「代碼」屬性。你的.ToString重寫將無處被調用。而不是重寫ToString,只需將該代碼公開爲實例屬性並綁定到該屬性即可。 – RPM1984 2010-09-08 05:59:42

回答

9

如果您設置了ValueMember,則不會調用ToString。如果您沒有設置ValueMember,它將按預期工作,但當然Code將不會用作ComboBox的選定值。

或者,如果您想使用ValueMember,您可能還需要設置DisplayMember。您可以創建一個用於顯示在你的MAP的屬性,即:

public class MAP 
{ 
    public readonly string Name; 

    private string code; 

    public string Code { get { return code; } } 
    public string Display { get { return ToString(); } } 

    public MAP(string Name, string Code) 
    { 
     this.Name = Name; 
     this.code = Code; 
    } 

    public override string ToString() 
    { 
     return String.Format("{0}: {1}", Name, Code); 
    } 
} 

,然後你可以設置DisplayMember形式:

MAPList MAP = new MAPList(); 
comboBox1.DataSource = MAP.All; 
comboBox1.ValueMember = "Code"; 
comboBox1.DisplayMember = "Display"; 
1

這是因爲您已將ValueMember屬性設置爲「代碼」,因此組合框中的值不是Map對象,而是與其Code屬性對應的字符串。

如果您刪除此行:

comboBox1.ValueMember = "Code"; 

...當你想到它會工作。

如果你想根據自己的Map類型的ToString方法的組合框顯示的項目,然後Jakob's answer是正確的:創建一個提供格式化你到底怎麼想的那樣一個字符串您Map類型的屬性,並設置DisplayMember ComboBox屬性的名稱爲這個屬性。

+0

我同意,這正是我之前實施的方式。但是我的要求迫使我在comboBox1.SelectedValue不是格式化的字符串時檢索「代碼」的值。 – Moon 2010-09-08 06:08:07

+0

@Ruby:見雅各布的回答;我認爲這提供了您正在尋找的解決方案。 – 2010-09-08 06:13:16

0

這可能是因爲使用ValueMember。使用DisplayMember屬性,在該屬性的get類中添加Map類中的另一個屬性返回格式化的字符串。

0

我知道這是舊的文章,但如果有人想要使用ToString()而不創建屬性來調用ToString(),則必須將DisplayMember值明確設置爲如下所示的空字符串:

Form1。cs:

private void Form1_Load(object sender, EventArgs e) { 
    ... 
    ...  
    MAPList MAP = new MAPList(); 
    comboBox1.DataSource = MAP.All; 
    comboBox1.ValueMember = "Code"; 
    comboBox1.DisplayMember = ""; // Explicitly set it to an empty String 
    ... 
    ... 
}