我有一个组合框用于项目列表,我使用以下代码填充:
List<string> comboboxItems = new List<string>();
foreach (var p in products)
{
var x = p.Product;
foreach (var pn in x)
{
comboboxItems.Add(pn.name + " :Qty " + pn.quantity_available
+ " :Tax " + pn.default_tax_tier);
}
}
cmbItems.DataSource = comboboxItems;
为了在选择组合框项目时获取值pn.name,我该怎么办?
使用WinForms。
答案 0 :(得分:1)
您必须处理事件DataGridView.EditingControlShowing
事件,在那里您可以访问实际的组合框并注册SelectedIndexChanged
事件处理程序,如下所示:
//EditingControlShowing event handler for your dataGridView1
private void dataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e){
if(dataGridView1.CurrentCell.OwningColumn == cmbItems){
var combo = e.Control as ComboBox;
combo.SelectedIndexChanged -= cmbItems_SelectedIndexChanged;
combo.SelectedIndexChanged += cmbItems_SelectedIndexChanged;
}
}
private void cmbItems_SelectedIndexChanged(object sender, EventArgs e){
var combo = sender as ComboBox;
//Note that SelectedItem may be null
var s = Convert.ToString(combo.SelectedItem);
int i = s.IndexOf(" :Qty");
var selectedName = i == -1 ? "" : s.Substring(0,i+1).TrimEnd();
//other code ...
}
答案 1 :(得分:0)
你应该创建一个项目,如
public class CboItem
{
public string Text { get; set; }
public object Value { get; set; }
public override string ToString()
{
return Text;
}
}
然后您可以使用
之类的东西轻松创建CboItem item = new CboItem();
item.Text = "My Item";
item.Value = "Anything";
在价值中,您可以存储var pn
无论它是什么。
然后你可以像这样检索:
((CboItem)comboBox1.SelectedItem).Value;
您需要将上面的结果转换为您存储在内部的正确类型,因为Value
属于object类型。
答案 2 :(得分:0)
我们还可以使用正则表达式从字符串中提取数据。
以下列格式创建字符串变量
string inputPattern = "{0} :Qty {1} :Tax {2}";
将数据插入组合框时,
comboboxItems.Add(string.Format(inputPattern, p.Name, p.Quantity_Available, p.Tax));
添加之后,为了提取字符串,我们可以使用Regex,下面的代码片段。
string extractPattern = "(?<Name>.*) :Qty (?<Qty>.*) :Tax (?<Tax>.*)";
foreach (var item in (comboBox1.DataSource as List<string>))
{
var matches = Regex.Match(item, extractPattern);
if (matches.Groups["Name"].Success)
{
MessageBox.Show(matches.Groups["Name"].Value);
}
if (matches.Groups["Qty"].Success)
{
MessageBox.Show(matches.Groups["Qty"].Value);
}
if (matches.Groups["Tax"].Success)
{
MessageBox.Show(matches.Groups["Tax"].Value);
}
}