在组合框中选中时显示项目的特定部分

时间:2019-07-07 14:28:15

标签: c# winforms combobox

我有一个组合框,可以显示每个国家的名称及其移动代码。
我希望组合框在选择项目时仅显示国家(地区)代码,而不显示其名称。
例如,我有Albania +355;选择该代码时,我只想查看它的代码(+355
这些项目写在Items集合属性中。
有什么代码可以做到这一点?

我不怎么尝试,因为我不知道该怎么做,我唯一尝试过的就是comboBox6.Text = "";,但这会删除整个文本。

2 个答案:

答案 0 :(得分:1)

我的建议si是构建一个包含所需所有值的类,然后使用List<class>设置ComboBox.DataSource属性。

DisplayMember 设置为用作列表可见字符串的属性名称,并将 ValueMember 设置为所需的属性名称用作ComboBox.Text

然后,您可以将ComboBox.Text设置为 ComboBox.SelectedValue.ToString() SelectedValue就像SelectedItemobject,需要强制转换。您知道它是一个字符串,因此只需转换它)。
ComboBox.Text必须经过一小段延迟后设置(控件已经自行更改了文本之后)。可以通过将文本更改为我们所需的动作来调用Control.BeginInvoke()

使用一个简单的类对象存储值:

private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DisplayMember = "CountryAndCode";
    comboBox1.ValueMember = "Code";
    comboBox1.DataSource = countryCodes;
    comboBox1.SelectedIndex = -1;

    comboBox1.SelectedIndexChanged += (o, ev) => {
        if (comboBox1.SelectedIndex < 0) return;
        comboBox1.BeginInvoke(new Action(() => {
            comboBox1.Text = comboBox1.SelectedValue.ToString();
        }));
    };
}

public List<CountryCode> countryCodes = new List<CountryCode>() {
    new CountryCode() { Country = "USA", Code = "+1" },
    new CountryCode() { Country = "Canada", Code = "+1" },
    new CountryCode() { Country = "Argentina", Code = "+54"},
    new CountryCode() { Country = "Brasil", Code = "+55"}
};

类定义:

public class CountryCode
{
    public CountryCode() { }
    public string Country { get; set; }
    public string Code { get; set; }
    public string CountryAndCode => this.ToString();

    public override string ToString() => this.Country + (char)32 + this.Code;
}

注意 comboBox1.SelectedItem CountryCode 类对象。您只需要将其强制转换为CountryCode即可读取此Item的所有属性。

var item = comboBox1.SelectedItem as CountryCode;
string selectedName = item.Country;
string selectedCode = item.Code; // etc.

如果您想保留简单的字符串格式,则可以使用List<string>
差不多是同一件事(除了灵活性降低)。您可以使用string.LastIndexOf() ComboBox.SelectedItem 中提取国家/地区代码,以确定 + 字符在字符串中的位置:

private List<string> simpleCountryCodes = new List<string>() {
    "USA +1", "Canada +1", "Argentina +54", "Brasil +55"
};

private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DataSource = simpleCountryCodes;
    comboBox1.SelectedIndex = -1;

    comboBox1.SelectedIndexChanged += (o, ev) => {
        if (comboBox1.SelectedIndex < 0) return;
        string item = comboBox1.SelectedItem.ToString();
        string code = item.Substring(item.LastIndexOf("+"));
        comboBox1.BeginInvoke(new Action(() => { comboBox1.Text = code; }));
    };
 }

如果您决定将 List<string> 转换为 List<CountryCode> ,则可以使用LINQ生成 CountryCode 这样的字符串中的对象:

var countryCodes = new List<CountryCode>();
countryCodes.AddRange(simpleCountryCodes.Select(c => new CountryCode() {
    Code = c.Substring(c.LastIndexOf("+")),
    Country = c.Substring(0, c.IndexOf("+") - 1)
}).ToArray());

这是两种情况下的工作方式:

ComboBox Text Custom Action

答案 1 :(得分:0)

在窗体上放置一个TextBox和ComboBox,然后执行以下操作:

public partial class Form1 : Form
{
    private Dictionary<string, string> countryCodes = new Dictionary<string, string>()
    {
        { "Albania", "Albania +355" },
        { "USA", "USA +1" },
        { "Iran", "Iran +98" },
    };

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        comboBox1.Items.AddRange(countryCodes.Values.ToArray());
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        textBox1.Text = countryCodes.Where(x => x.Value == comboBox1.SelectedItem.ToString()).First().Key;
    }
}

enter image description here

选择一个项目后:

enter image description here

编辑: 如果要在文本框中查看代码,可以将countryInfo更改为:

private Dictionary<string, string> coubtryCodes = new Dictionary<string, 
string>()
{
     { "+355", "Albania +355" },
     { "+1", "USA +1" },
     { "+98", "Iran +98" },
};