C# 从组合框选择中提取特定字符串

C# 从组合框选择中提取特定字符串,c#,winforms,datagridcomboboxcolumn,C#,Winforms,Datagridcomboboxcolumn,我有一个用于项目列表的组合框,我使用以下代码填充该组合框: 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

我有一个用于项目列表的组合框,我使用以下代码填充该组合框:

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;
List comboboxItems=new List();
foreach(产品中的var p)
{
var x=p.乘积;
foreach(x中的var pn)
{
comboboxItems.Add(pn.name+“:数量+pn.quantity\u可用
+“:Tax”+pn.默认税层);
}
}
cmbItems.DataSource=comboboxItems;
只有在选择了combobox项时,我应该怎么做才能获得值pn.name


使用WinForms。

您应该创建一个项目,如

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;

您需要将上面的结果转换为存储在其中的正确类型,因为
值属于object类型。

我们还可以使用正则表达式从字符串中提取数据

按以下格式创建字符串变量

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);
            }
        }
string extractPattern=“(?*):数量(?*):税(?*);
foreach(变量项在(comboBox1.DataSource作为列表))
{
var matches=Regex.Match(项,模式);
如果(匹配.Groups[“Name”]。成功)
{
MessageBox.Show(匹配.Groups[“Name”].Value);
}
如果(匹配组[“数量”]。成功)
{
MessageBox.Show(匹配.Groups[“数量”].Value);
}
如果(匹配.Groups[“Tax”]。成功)
{
MessageBox.Show(匹配.Groups[“Tax”].Value);
}
}

您必须处理事件
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 ...
}

是WPF还是Winforms?@KinyanjuiKamau在第二种方法
cmbItems\u SelectedIndexChanged
中查看更新的代码这正是我需要的。刚刚在上一条语句的末尾添加了.Trim(),效果非常好+1@EmmadKareem它来自您的标记
datagridcomboboxcolumn
,因此我猜您的
cmbItems
是一个
DataGridViewComboxColumn
,而不是一个
组合框
,但是如果它只是一个组合框,那么附加
SelectedIndexChanged
事件处理程序的代码要简单得多。是的,cmbItems是DataGridViewComboBoxColumn。感谢您的回复。