Показывать определенную часть элемента при выборе в поле со списком - PullRequest
0 голосов
/ 07 июля 2019

У меня есть ComboBox, который показывает название каждой страны и ее мобильный код.
Я хочу, чтобы ComboBox отображал только Код страны при выборе элемента, а не его имя.
Например, у меня естьAlbania +355;Я хочу видеть только код (+355) при его выборе.
Элементы записываются в свойстве Items collection.
Есть ли какой-нибудь код, который может это сделать?

Я не очень старался, так как понятия не имею, как это можно сделать, единственное, что я попробовал, это comboBox6.Text = "";, но это удаляет весь текст.

Ответы [ 2 ]

1 голос
/ 07 июля 2019

Мое предложение 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

0 голосов
/ 07 июля 2019

Поместите 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" },
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...