2013-11-26 4 views
0

Я отправил вопрос на прошлой неделе, но на самом деле не понял, почему мне пришлось установить displaymember или valuemember для первого ответа.Значение ячейки DataGridViewComboBoxColumn, возвращающее нулевое значение

Смотря на другие форумы, я понимаю, что если я использую список, связанный с DataGridViewComboBoxColumn, тогда я должен получить выбранное значение довольно легко.

вопрос я отвечал здесь:

Setting DataGridViewComboBoxColumn.Valuemember to a list<string>

теперь у меня есть этот код:

// set values to combobox column cells in datagridview 
GridSellProducts.Rows.Add(); 
DataGridViewComboBoxColumn cmbItems = (DataGridViewComboBoxColumn)GridSellProducts.Columns["Item"]; 

cmbItems.DataSource = productNames; 

cmbItems.AutoComplete = true; 

GridSellProducts.EditingControlShowing += new 
      DataGridViewEditingControlShowingEventHandler(GridSellProducts_EditingControlShowing); 

private void LastColumnComboSelectionChanged(object sender, EventArgs e) 
{ 
     string itemValue = GridSellProducts.Rows[GridSellProducts.CurrentCell.RowIndex].Cells["Item"].FormattedValue.ToString(); 
.......code 
} 

Однако значение строки ItemValue выше всегда нулевой, то есть строка ItemValue = "" ; когда я запускаю свой код. Почему это?

Добавлено:

Это, как я заселение productNames

private void AutocompleteItems() 
     { 
      // get products 
      productsURL = "https://eko-app.com/Products/list_products/sessionId:" + sessionID + ".json"; 

      var products = Products.GetProducts(productsURL); 

      List<string> productNames = new List<string>(); 

      foreach (var p in products) 
      { 
       var x = p.Product; 

       foreach (var pn in x) 
       { 
        productNames.Add(pn.name); 
       } 
      } 

      // set values to combobox column cells in datagridview 
      GridSellProducts.Rows.Add(); 
      DataGridViewComboBoxColumn cmbItems = (DataGridViewComboBoxColumn)GridSellProducts.Columns["Item"]; 

      cmbItems.DataSource = productNames; 

      cmbItems.AutoComplete = true; 

      GridSellProducts.EditingControlShowing += new 
      DataGridViewEditingControlShowingEventHandler(GridSellProducts_EditingControlShowing); 
     }  

класса Продукты

//some code 
public class Product 
{ 
    public string product_id { get; set; } 
    public string name { get; set; } 
    public decimal selling { get; set; } 
    public decimal buying { get; set; } 
    public string default_tax_tier { get; set; } 
    public string quantity_available { get; set; } 
} 

ответ

0

Я просто была такая же проблема. Ответ немного поздний, но я надеюсь, что это поможет кому-то. Вместо того чтобы устанавливать источник данных столбца, я добавил объекты по отдельности в колонну, как это:

DataGridViewComboBoxColumn column = (DataGridViewComboBoxColumn)GridSellProducts.Columns["Item"]; 
foreach (string productname in productNames) 
{ 
    column.Items.Add(productname); 
} 
this.ValueType = typeof(string); 
// if you use a custom object instead of a string, set these values: 
// this.DisplayMember = "value"; 
// this.ValueMember = "hiddenValue"; 

Тогда вы можете получить значение объекта (строка или что-то другое), получая SelectedItem от DataGridViewComboBoxEditingControl в обработчик событий. Этот элемент будет объектом, добавленным к элементам столбца (строка в этом случае). Код, который работал для меня:

private void LastColumnComboSelectionChanged(object sender, EventArgs e) 
{ 
    var sendingCB = sender as DataGridViewComboBoxEditingControl; 
    var currentcell = mappingDataGridView.CurrentCellAddress; 

    if (currentcell.X == 0) 
    { 
     object value = sendingCB.SelectedItem; 
     if (value != null) 
     { 
      string itemValue = (string)sendingCB.SelectedItem; 
      // 
      // or with an other object it looks like this: 
      // int intValue = ((ComboBoxItem)sendingCB.SelectedItem).hiddenValue; 
     } 
    } 
} 

Я использовал this пост, чтобы увидеть, как использовать обработчик событий для DataGridViewComboBoxColumn. Надеюсь, это поможет кому-то :).

Смежные вопросы