2013-12-04 4 views
0

У меня есть выпадающий для списка пункт, который я заселить, используя следующий код:Извлечение определенной строки из выпадающего списка выберите

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

является его WPF или Winforms? –

ответ

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 ... 
} 
+0

@KinyanjuiKamau см. Обновленный код прямо во втором методе 'cmbItems_SelectedIndexChanged' –

+1

Это именно то, что мне нужно. Просто добавлен .Trim() в конец вашего последнего заявления и работает отлично. +1 –

+0

Просто интересно, откуда появился DataGridViwe? – NoChance

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 представляет объект типа.

+0

Спасибо за ваш ответ Franck. –

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); 
      } 
     } 
Смежные вопросы