C# WinForms:DataGridView-编辑单元格时显示组合框
在C#应用程序中,我有一个DatagridView,所有单元格都是DataGridTextBoxCol。网格由未绑定的值动态填充。网格有不同类型的食物项。 我的需要是,当用户点击/想要编辑一个单元格时,一个包含食物列表的组合框会代替单元格出现。若它们是单元格中的任何值,那个么应该在combo中选择该值。用户可以在combo中键入并选择项。 这就是我迄今为止所尝试的:C# WinForms:DataGridView-编辑单元格时显示组合框,c#,winforms,datagridview,combobox,datagridtextcolumn,C#,Winforms,Datagridview,Combobox,Datagridtextcolumn,在C#应用程序中,我有一个DatagridView,所有单元格都是DataGridTextBoxCol。网格由未绑定的值动态填充。网格有不同类型的食物项。 我的需要是,当用户点击/想要编辑一个单元格时,一个包含食物列表的组合框会代替单元格出现。若它们是单元格中的任何值,那个么应该在combo中选择该值。用户可以在combo中键入并选择项。 这就是我迄今为止所尝试的: private void PopulateAllergensCombo() { // Populate C
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";
}
要在当前单元格中放置此组合,请执行以下操作
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();
}
与上面的事件代码一样,组合不会显示在单元格位置。单元格的位置为X=0,Y=11-第1列第1行单元格。它与形状尺寸无关。
为了在网格单元格中获取和设置从combo中选择的项的值,我尝试实现CellEndEdit和AllergonSCMB_SelectedIndexChanged事件。但没有任何东西能100%工作。使用selectedIndexChanged事件,我丢失了当前单元格,因为单元格不再处于活动状态;无法获取当前单元格或它是否脏
任何线索,我如何实现这种类型的控件-在DataGridView的当前单元格上显示一个组合框。我做了大量的研究和尝试,但都没有达到预期效果
非常感谢您的帮助
//////////////////////////////////////////
************更新
//////////////////////////////////////////
正如你们建议使用DataGridViewComboxColumn一样,我做到了:
// 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;
}
//添加列
对于(int i=1;i 0)
dgvr.Cells[cbrData.Col-1].Value=cbrData.CellAllogen.AllergonsNumber;
其他的
dgvr.Cells[cbrData.Col-1]。值=0;
}
这很好。在网格中,我只将每个单元格视为组合框。如何使其仅显示为普通文本以及仅在编辑时显示为组合框。使用EditingControlShowing事件的原因是什么?我不明白这个逻辑??我只需要更改该值&将标志isCellAssignGridChanged
设置为true,以便更新数据库
请你把这部分的光线照一下好吗
谢谢谢谢普卢托尼克斯和约翰肯
datagridviewcomboxcolumn
DisplayStyle=DataGridViewComboxDisplayStyle.Nothing
private void cellAssignments_dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control is ComboBox)
{
ComboBox cb = (ComboBox)e.Control;
if (cb != null)
{
// Show the DropDown of the combo & set its event
cb.DropDownStyle = ComboBoxStyle.DropDownList;
cb.SelectionChangeCommitted -= cb_SelectionChangeCommitted;
cb.SelectionChangeCommitted += cb_SelectionChangeCommitted;
}
}
}
void cb_SelectionChangeCommitted(object sender, EventArgs e)
{
ComboBox cb = (ComboBox)sender;
if (cb != null)
{
Console.WriteLine("Selected Combo = " + cb.SelectedText + " Value = " + cb.SelectedValue);
// Notify the cell is dirty
cellAssignments_dgv.NotifyCurrentCellDirty(true);
// Force to End Edit the Cell
cellAssignments_dgv.EndEdit();
}
}
CellEndEdit
事件中,实现了我对集合对象的更新关于,您可以在网格中添加一个
DataGridViewComboBoxColumn
,而不是在CBO和DGV之间切换。您是否尝试过editcontrolshowing事件?如果它是相同的列表,使用相同的数据源,完全没有额外的开销。将其设置为组合框而不是文本单元格…您可以默认某些属性使其看起来像文本框…然后editcontrolshowing将workDropdownstyle设置为none?