C# アプリでは、すべてのセルを DataGridTextBoxCol として持つ DatagridView があります。グリッドには、バインドされていない値が動的に入力されます。グリッドにはさまざまな種類の食品があります。私の必要性は、ユーザーがセルをクリック/編集したいときに、セルの代わりに食品のリストを含むコンボボックスが表示されることです。それらがセル内の値である場合、その値はコンボで選択する必要があります。ユーザーが入力すると、アイテムがコンボで選択されます。これは私がこれまでに試したことです:
private void PopulateAllergensCombo()
{
// Populate Combo box in Form_load & be hidden
BindingSource allergensBindSource = new BindingSource();
allergensList = dbOperations.GetAllergensListObjects();
allergensBindSource.DataSource = allergensList;
allergensCmb.DataSource = allergensBindSource.DataSource; // allergensList;
allergensCmb.DisplayMember = "Name";
allergensCmb.ValueMember = "AllergensNumber";
}
このコンボallergensCmb
を現在のセルに配置するには
private void cellAssignments_dgv_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
DataGridViewCell dvCell = cellAssignments_dgv.CurrentCell;
allergensCmb.Location = dvCell.ContentBounds.Location; // location of cell is X=0, Y=11 - This seems to be relevant from grid & not from Form
if ( String.IsNullOrEmpty(cellAssignments_dgv.CurrentCell.Value.ToString()) == false )
allergensCmb.SelectedValue = cellAssignments_dgv.CurrentCell.Value;
allergensCmb.Show();
}
上記のdgv_CellBeginEdit
イベント コードと同様に、コンボはセルの位置に表示されません。セルの位置は X=0、Y=11 - 1 列 1 行目のセルです。フォームの寸法には関係ありません。グリッドセルのコンボから選択された項目の値を取得および設定するために、CellEndEdit および allergensCmb_SelectedIndexChanged イベントを実装してみました。しかし、100%完全に機能するものはありません。selectedIndexChanged イベントでは、セルがアクティブでなくなったため、現在のセルが失われました。現在のセルを取得できないか、それが汚れている場合!!
手掛かり、このタイプのコントロールを実装するにはどうすればよいですか - DataGridView の現在のセルにコンボボックスを表示します。いろいろ調べて試してみましたが、期待通りの結果は得られませんでした。
どんな助けでも大歓迎です。
//////////////////////////////////////// ******** **** 更新 ///////////////////////////////////////
あなたが両方とも DataGridViewComboBoxColumn を使用することを提案したように、私はしました:
// Add Columns
for (int i = 1; i <= pair.Value.CellBodyRowData.Count; i++)
{
DataGridViewComboBoxColumn cbCol = new DataGridViewComboBoxColumn();
cbCol.HeaderText = i.ToString();
cbCol.Name = i.ToString();
cbCol.DataSource = allergensList;
cbCol.ValueMember = "AllergensNumber";
cbCol.DisplayMember = "Name";
cellAssignments_dgv.Columns.Add(cbCol);
// *** cellAssignments_dgv.Columns.Add((i.ToString(), i.ToString());
}
// Populate in each Row
foreach (CellBodyRowData cbrData in cbRow.CellBodyRowData)
{
// ***** dgvr.Cells[cbrData.Col - 1].Value = cbrData.CellAllergen.Name;
if (cbrData.CellAllergen.AllergensNumber > 0)
dgvr.Cells[cbrData.Col - 1].Value = cbrData.CellAllergen.AllergensNumber;
else
dgvr.Cells[cbrData.Col - 1].Value = 0;
}
これで問題ありません。グリッドでは、各セルが ComboBox のみとして表示されます。通常のテキストとしてのみ表示し、編集中にのみコンボボックスとして表示するにはどうすればよいですか。EditingControlShowing イベントを使用する理由は何ですか?そのロジックがわかりません?? 値を変更してフラグisCellAssignGridChanged
をtrueに設定する必要があるので、DBを更新できます。
この部分に光を当ててください。
ありがとう