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를 업데이트 할 수 있습니다.
이 부분에 약간의 빛을 내실 수 있습니까?
감사합니다.
오히려 CBO와 DGV 사이 셔플보다 더, 당신은이 '그리드 – Plutonix
에 DataGridViewComboBoxColumn' 당신이 editcontrolshowing 이벤트를 시도 추가 할 수 있습니다? – Ctznkane525
@Plutonix, 그리드에는 셀이 여러 개있을 수 있으며 모두 식품 항목 이름 만 있습니다. 동일한 목록/데이터를 가진 많은 CMB가 너무 무겁습니다. 그러므로 이쪽. –