我有一个组合框,可以显示每个国家的名称及其移动代码。
我希望组合框在选择项目时仅显示国家(地区)代码,而不显示其名称。
例如,我有Albania +355
;选择该代码时,我只想查看它的代码(+355
。
这些项目写在Items
集合属性中。
有什么代码可以做到这一点?
我不怎么尝试,因为我不知道该怎么做,我唯一尝试过的就是comboBox6.Text = "";
,但这会删除整个文本。
答案 0 :(得分:1)
我的建议si是构建一个包含所需所有值的类,然后使用List<class>
设置ComboBox.DataSource属性。
将 DisplayMember
设置为用作列表可见字符串的属性名称,并将 ValueMember
设置为所需的属性名称用作ComboBox.Text
。
然后,您可以将ComboBox.Text
设置为 ComboBox.SelectedValue.ToString()
(SelectedValue
就像SelectedItem
是object
,需要强制转换。您知道它是一个字符串,因此只需转换它)。
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());
这是两种情况下的工作方式:
答案 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;
}
}
选择一个项目后:
编辑: 如果要在文本框中查看代码,可以将countryInfo更改为:
private Dictionary<string, string> coubtryCodes = new Dictionary<string,
string>()
{
{ "+355", "Albania +355" },
{ "+1", "USA +1" },
{ "+98", "Iran +98" },
};