2017-12-25 5 views
0

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

+1

vielmehr zwischen einem CBO und dem DGV als schlurfend, könnte man hinzufügen, ein 'DataGridViewComboBoxColumn' an das Netz – Plutonix

+0

Haben Sie das editcontrolshowing Ereignis versucht? – Ctznkane525

+0

@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. –

Antwort

0

Dank @Plutonix und @JohnKane.

  1. Ich habe die Spalten im Raster auf DataGridViewComboBoxColumn geändert.
  2. Ändern Sie die DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing; der Spalten.
  3. Implementiert EditingControlShowing Ereignis und änderte den Drop-Down-Stil cb.DropDownStyle = ComboBoxStyle.DropDownList; & SelectionChangeCommitted für die 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. schließlich in CellEndEdit Fall implementiert mein Update Aktualisierung der Sammlungsobjekt

Hope this jemand hilft.

Grüße,