Мое предложение si создать класс, содержащий все необходимые значения, а затем использовать List<class>
для установки свойства ComboBox.DataSource .
Установите DisplayMember
на имя свойства, которое будет использоваться в качестве видимой строки списка, а ValueMember
на имя свойства, которое вы хотите использовать в качествеComboBox.Text
.
Тогда вы можете просто установить ComboBox.Text
на ComboBox.SelectedValue.ToString()
(SelectedValue
, как SelectedItem
, это object
, вам нужно разыграть его. Вы знаете, что этострока, так что просто конвертируйте it).
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
, чтобы прочитать все свойства этого предмета.
var item = comboBox1.SelectedItem as CountryCode;
string selectedName = item.Country;
string selectedCode = item.Code; // etc.
Если вместо этого вы хотите сохранить простой формат строки, вы можете использовать List<string>
.
Это более или менее то же самое (за исключением потери гибкости).Вы можете извлечь код страны из ComboBox.SelectedItem
, используя string.LastIndexOf () , чтобы определить положение символа +
в строке:
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](https://i.stack.imgur.com/dF5vL.gif)