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の色を追加しました。

したがって、ユーザはedit、droplistの表示を呼び出し、アイテム0を選択します。これは前述のハンドラで傍受します。彼らはアイテム0を選んだので、異なる色を選択できるようにポップアップダイアログを表示します。

これを選択したら、列の項目の必須リストに追加するか、それを追加する必要があります。今は意味が分かりますか?

DataGridView Notifyオブジェクトを使用しようとしましたが、何らかの理由で使用可能な関数のリストに表示されません。

私はDataSourceを使用しません。私は、列のコンストラクタで、次のように移入:

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

あなたが編集コントロールを所有しているDataGridViewを見つけるためにEditingControlDataGridViewを使用することができます。次に、グリッドの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); ' –

関連する問題