In einer C# -App habe ich eine DatagridView mit allen Zellen als DataGridTextBoxCol. Das Raster wird dynamisch mit ungebundenen Werten gefüllt. Gitter hat verschiedene Arten von Lebensmitteln. Mein Bedarf ist, wenn Benutzer klickt/möchte eine Zelle bearbeiten - ein Kombinationsfeld mit einer Liste von Lebensmitteln erscheint anstelle der Zelle. Wenn in der Zelle ein beliebiger Wert angegeben ist, sollte dieser Wert in Kombination ausgewählt werden. Benutzer kann eingeben und Element wird in Kombination ausgewählt. Das ist, was ich bisher versucht habe:WinForms: DataGridView - Combobox anzeigen, wenn Zelle bearbeitet wird
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";
}
diese Combo allergensCmb
in der aktuellen Zelle
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();
}
Wie bei dem oben dgv_CellBeginEdit
Ereigniscode zu platzieren, wird die Combo zeigt nicht in der Zelle Lage. Der Ort der Zelle ist X = 0, Y = 11 - 1. Spalte der ersten Zeile. Es ist nicht relevant für die Formulardimensionen. Um den Wert des in der Gitterzelle ausgewählten Elements zu ermitteln und festzulegen, habe ich versucht, die Ereignisse CellEndEdit und allergensCmb_SelectedIndexChanged zu implementieren. Aber nichts funktioniert voll 100%. Mit dem selectedIndexChanged-Ereignis habe ich die aktuelle Zelle verloren, da die Zelle nicht mehr aktiv ist. kann die aktuelle Zelle nicht bekommen oder wenn sie dreckig ist !!
Jeder Hinweis, wie implementiere ich diese Art von Steuerelement - zeigen Sie eine Combobox auf der aktuellen Zelle des DataGridView. Ich habe viel recherchiert und ausprobiert, aber nichts funktioniert wie erwartet.
Jede Hilfe wird sehr geschätzt.
///////////////////////////////////////////// *** ********* UPDATIONEN /////////////////////////////////////////// ///
Wie Sie beide vorgeschlagen DataGridViewComboBoxColumn zu verwenden, ich habe:
// 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;
}
Das ist in Ordnung. Im Raster sehe ich jede Zelle nur als ComboBox. Wie mache ich es nur als normalen Text angezeigt und nur während der Bearbeitung erscheint es als Combobox. Und was ist der Grund EditingControlShowing -Ereignis zu verwenden - ich bekomme diese Logik nicht ?? Ich muss den Wert & ändern, setzen Sie ein Flag isCellAssignGridChanged
auf True, so kann die DB aktualisieren.
Können Sie bitte etwas Licht auf dieses Teil werfen.
Dank
vielmehr zwischen einem CBO und dem DGV als schlurfend, könnte man hinzufügen, ein 'DataGridViewComboBoxColumn' an das Netz – Plutonix
Haben Sie das editcontrolshowing Ereignis versucht? – Ctznkane525
@Plutonix, das Gitter kann mehrere Zellen haben und alle haben nur den Namen von Lebensmitteln. So viele CMB mit derselben Liste/Daten machen es zu schwer. Daher auf diese Weise. –