2017-12-25 53 views
0

C# 응용 프로그램에서는 모든 셀에 대해 DataGridTextBoxCol이라는 DatagridView가 있습니다. 그리드는 언 바운드 값으로 동적으로 채워집니다. 그리드에는 다른 유형의 식품 품목이 있습니다. 필자가 사용자가 셀을 클릭하거나 편집하려고 할 때 셀 대신 음식 항목 목록이있는 콤보 상자가 나타납니다. 값이 셀의 값이면 콤보로 값을 선택해야합니다. 사용자는 입력 할 수 있으며 항목은 콤보로 선택됩니다. 이것은 내가 지금까지 시도한 것입니다 :WinForms : DataGridView - 셀을 편집 할 때 Combobox 표시

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"; 
    } 

는 현재 셀 위의 dgv_CellBeginEdit 이벤트 코드와 마찬가지로

 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(); 
    } 

이 콤보 allergensCmb을 배치하려면 콤보는 셀에 표시되지 않습니다 위치. 셀의 위치는 X = 0, Y = 11 - 첫 번째 col 첫 번째 행 셀입니다. 양식 크기와 관련이 없습니다. 표 셀의 콤보에서 선택한 항목의 값을 가져오고 설정하려면 CellEndEdit 및 allergensCmb_SelectedIndexChanged 이벤트를 구현하려고했습니다. 그러나 아무것도 100 % 완전하게 작동하지 않습니다. selectedIndexChanged 이벤트를 사용하면 셀이 더 이상 활성화되지 않으므로 현재 셀을 잃어 버렸습니다. 현재 셀을 가져올 수 없거나 더러운 경우 !!

단서, 어떻게 이런 유형의 컨트롤을 구현합니까? DataGridView의 현재 셀에 Combobox를 표시합니다. 나는 많은 연구를 해보았지만 아무 것도 예상대로 작동하지 않았습니다.

도움이 매우 감사합니다.

/////////////////////////////////////////////////// *** ********* UPDATIONS /////////////////////////////////////////////////////////// /// 둘 다 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 플래그를 설정하므로 DB를 업데이트 할 수 있습니다.

이 부분에 약간의 빛을 내실 수 있습니까?

감사합니다.

+1

오히려 CBO와 DGV 사이 셔플보다 더, 당신은이 '그리드 – Plutonix

+0

에 DataGridViewComboBoxColumn' 당신이 editcontrolshowing 이벤트를 시도 추가 할 수 있습니다? – Ctznkane525

+0

@Plutonix, 그리드에는 셀이 여러 개있을 수 있으며 모두 식품 항목 이름 만 있습니다. 동일한 목록/데이터를 가진 많은 CMB가 너무 무겁습니다. 그러므로 이쪽. –

답변

0

감사합니다. @Plutonix 및 @JohnKane.

  1. 그리드에서 열을 DataGridViewComboBoxColumn으로 변경했습니다.
  2. col의 DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;을 변경하십시오.
  3. 구현 EditingControlShowing 이벤트와는 CellEndEdit 이벤트에서 콤보 마지막으로

    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. 의 드롭 다운 스타일 cb.DropDownStyle = ComboBoxStyle.DropDownList; & SelectionChangeCommitted 변경이 어떤 일을하는 데 도움이

희망 내 업데이트 갱신 컬렉션 개체를 구현했습니다.

감사합니다,