winforms:datagridview-编辑单元格时显示combobox



在c#应用中,我有一个带有所有单元格的datagridview作为datagridtextboxcol。网格的动态填充有未结合的值。网格具有不同类型的食品。 我的需求是,当用户单击/想要编辑单元格时 - 一个包含食物列表的组合框就会代替单元格。如果它们是单元格中的任何值,则应在组合中选择该值。用户可以输入并在组合中选择项目。 这是我到目前为止尝试的:

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-1st col 1st Ryst单元格。它与形式的维度无关。为了获取并设置从网格单元中组合中选择的项目的值,我尝试实现CellendedIt和AlergensCMB_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;
                }

这很好。在网格中,我将每个细胞视为Commobox。我如何仅作为正常文本显示,并且仅在编辑时才显示为组合。使用Editing Controlshowing事件的原因是什么 - 我没有逻辑?我需要更改价值&amp;将标志isCellAssignGridChanged设置为true,因此可以更新DB。

您可以在这部分上亮一点。

谢谢

谢谢@plutonix和@johnkane。

  1. 我将Cols更改为网格中的DataGridViewComboBoxColumn
  2. 更改Cols的DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
  3. 实施了EditingControlShowing事件,并更改了下拉式 cb.DropDownStyle = ComboBoxStyle.DropDownList;&amp;选择COMBOBOX

    的选择
    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();
        }
    }
    
  4. 最后,在CellEndEdit事件中,实现了我的更新,收集对象

希望这对某些人有帮助。

问:

最新更新