簡體   English   中英

C#combobox重寫了ToString

[英]C# combobox overridden ToString

我在使用ComboBox時遇到了一些問題。

我的組合框的顯示成員沒有被類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);
    }
}

如果設置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";

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

如果刪除此行:

comboBox1.ValueMember = "Code";

......它會像你期望的那樣工作。

如果你想讓ComboBox根據你的Map類型的ToString方法顯示它的項目,那么Jakob的答案是正確的:在你的Map類型上創建一個屬性,提供一個完全符合你想要的格式的字符串,並設置ComboBox的DisplayMember屬性到這個屬性的名稱。

我知道這是一個舊帖子,但是如果有人想要使用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
    ...  
    ...  
}

這可能是因為你使用的是ValueMember。 使用DisplayMember屬性,在獲取此屬性的Map類中添加另一個屬性,返回格式化的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM