1

所以我有这个,我知道这是错误的:喂养从OnSelectionChangeCommitted DataGridViewComboBoxEditingControl一个替代值列对象

protected override void OnSelectionChangeCommitted(EventArgs e) 
{ 
    if (SelectedIndex == 0) 
    { 
     GENIO_Viewer.FullColourPaletteForm dlgColour = new GENIO_Viewer.FullColourPaletteForm(); 
     if(dlgColour.ShowDialog() == DialogResult.OK) 
     { 
      bool bFound = false; 
      for(int i = 1; i < Items.Count; i++) 
      { 
       ComboboxColourItem ocbItem = (ComboboxColourItem)Items[i]; 
       if(ocbItem.Index == dlgColour.iSelectedColour) 
       { 
        SelectedIndex = i; 
        bFound = true; 
        break; 
        // We can just select this one 
       } 
      } 
      if(!bFound) 
      { 
       // Add it 
       ComboboxColourItem ocbItem = ComboboxColourItem.Create((ushort)dlgColour.iSelectedColour); 
       Items.Add(ocbItem); 
       SelectedIndex = Items.Count - 1; 
      } 
     } 
    } 

    base.OnSelectionChangeCommitted(e); 
} 

这个处理器是我DataGridViewComboBoxEditingControl的一部分。但是,添加新的Items是错误的地方。

我不能锻炼如何获得拥有Column,因为那是我需要添加项目的地方,否则我会得到例外。

我已经在这里看了:https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcomboboxeditingcontrol(v=vs.110).aspx

但我不能看到一个属性我可以用它来获取列对象。

我们如何从编辑控制中做到这一点?

进一步的解释:

列表组合项由“列”对象增加。因此,我们有一组15种颜色可供选择。现在我已经在列表中添加了一个genric颜色。

因此,用户调用编辑,下拉列表显示,然后他们选择项目0.我们用前面提到的处理程序拦截它。由于他们选择了项目0,我们显示一个弹出式对话框让他们选择不同的颜色。

当他们选择时,我们现在必须找到它或将其添加到列的项目的强制性列表。现在有道理?

我试图使用DataGridView通知对象,但出于某种原因它没有显示在可用函数列表中。

我不使用数据源。我填充像这样在列构造:

private void InitialiseComboItems() 
{ 
    List<ushort> listColours = new List<ushort>(); 
    listColours.Add(0); 
    listColours.Add(1); 
    listColours.Add(2); 
    listColours.Add(3); 
    listColours.Add(4); 
    listColours.Add(5); 
    listColours.Add(6); 
    listColours.Add(7); 
    listColours.Add(8); 
    listColours.Add(9); 
    listColours.Add(250); 
    listColours.Add(251); 
    listColours.Add(252); 
    listColours.Add(253); 
    listColours.Add(254); 
    listColours.Add(255); 

    this.Items.Clear(); 
    foreach (ushort iColourIndex in listColours) 
     this.Items.Add(ComboboxColourItem.Create(iColourIndex)); 
} 

我也有一个辅助方法:

public ComboboxColourItem InsertColour(ushort iColourIndex) 
{ 
    ComboboxColourItem ocbItem = ComboboxColourItem.Create(iColourIndex); 

    bool bAppend = true; 
    if (Items.Count > 16) 
    { 
     // There are other colours, need to find right index 
     for(int i = 16; i < Items.Count; i++) 
     { 
      if(ocbItem.Index < ((ComboboxColourItem)Items[i]).Index) 
      { 
       bAppend = false; 
       Items.Insert(i, ocbItem); 
       break; 
      } 
     } 
    } 
    if (bAppend) 
     Items.Add(ocbItem); 

    return ocbItem; 
} 
+0

如何将项目添加到列中?通过设置'DataSource'属性? –

回答

1

您可以使用EditingControlDataGridView找到该公司拥有的编辑控制DataGridView。然后您可以使用网格的CurrentCell属性来查找当前单元格,并使用ColumnIndex可以找到列索引。然后使用Columns集合,您可以获得该索引处的列:

var c = this.EditingControlDataGridView 
      .Columns[this.EditingControlDataGridView.CurrentCell.ColumnIndex] 
      as DataGridViewComboBoxColumn; 
if (c != null) 
    c.Items.Add("Something"); 
+0

阅读更新的答案。 –

+1

这个很好用!我不知道这个'EditingControlDataGridView'对象。我唯一需要做的另一件事就是将相同的对象添加到编辑控件Items列表中以避免发生异常:'Items.Insert(i,ocbItem);' –