DataGridViewComboBoxColumn向每一行添加不同的项目。

我正在使用DataGridView构建一个表,用户可以从每个单元格的下拉列表中选择项目。 为简化问题,假设我有1列。 我在设计器中使用DataGridViewComboBoxColumn。 我试图支持让该列中的每一行都有不同的项目列表供您选择。

这可能吗?

是。 这可以使用DataGridViewComboBoxCell完成。

这是一个将项目添加到一个单元格而不是整个列的示例方法。

private void setCellComboBoxItems(DataGridView dataGrid, int rowIndex, int colIndex, object[] itemsToAdd) { DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell) dataGrid.Rows[rowIndex].Cells[colIndex]; // You might pass a boolean to determine whether to clear or not. dgvcbc.Items.Clear(); foreach (object itemToAdd in itemsToAdd) { dgvcbc.Items.Add(itemToAdd); } } 
 private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == DataGridViewComboBoxColumnNumber) { setCellComboBoxItems(myDataGridView, e.RowIndex, e.ColumnIndex, someObj); } } 

万一有人找到这个post,这是我在VB 2008中的解决方案。它提供的优势是它允许你为combobox中的每个值分配一个ID。

  Private Sub FillGroups() Try 'Create Connection and SQLCommand here. Conn.Open() Dim dr As SqlDataReader = cm.ExecuteReader dgvGroups.Rows.Clear() Dim PreviousGroup As String = "" Dim l As New List(Of Groups) While dr.Read Dim g As New Groups g.RegionID = CheckInt(dr("cg_id")) g.RegionName = CheckString(dr("cg_name")) g.GroupID = CheckInt(dr("vg_id")) g.GroupName = CheckString(dr("vg_name")) l.Add(g) End While dr.Close() Conn.Close() For Each a In (From r In l Select r.RegionName, r.RegionID).Distinct Dim RegionID As Integer = a.RegionID 'Doing it this way avoids a warning dgvGroups.Rows.Add(New Object() {a.RegionID, a.RegionName}) Dim c As DataGridViewComboBoxCell = CType(dgvGroups.Rows(dgvGroups.RowCount - 1).Cells(colGroup.Index), DataGridViewComboBoxCell) c.DataSource = (From g In l Where g.RegionID = RegionID Select g.GroupID, g.GroupName).ToArray c.DisplayMember = "GroupName" c.ValueMember = "GroupID" Next Catch ex As Exception End Try End Sub Private Class Groups Private _RegionID As Integer Public Property RegionID() As Integer Get Return _RegionID End Get Set(ByVal value As Integer) _RegionID = value End Set End Property Private _RegionName As String Public Property RegionName() As String Get Return _RegionName End Get Set(ByVal value As String) _RegionName = value End Set End Property Private _GroupName As String Public Property GroupName() As String Get Return _GroupName End Get Set(ByVal value As String) _GroupName = value End Set End Property Private _GroupID As Integer Public Property GroupID() As Integer Get Return _GroupID End Get Set(ByVal value As Integer) _GroupID = value End Set End Property End Class 

这是一个gridView的例子,它有2个comboboxColumns,当一个comboBoxColumns1选择的索引发生变化时,然后用来自数据库的两个不同列的数据加载comboBoxColumns2。

  private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { if (dataGridView1.Rows[e.RowIndex].Cells[0].Value != null && dataGridView1.CurrentCell.ColumnIndex == 0) { SqlConnection conn = new SqlConnection("data source=.;initial catalog=pharmacy;integrated security=true"); SqlCommand cmd = new SqlCommand("select [drugTypeParent],[drugTypeChild] from [drugs] where [drugName]='" + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString() + "'", conn); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { object[] o = new object[] { dr[0].ToString(),dr[1].ToString() }; DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[1]; dgvcbc.Items.Clear(); foreach (object itemToAdd in o) { dgvcbc.Items.Add(itemToAdd); } } dr.Close(); conn.Close(); } } 
  //Populate the Datatable with the Lookup lists private DataTable typeDataTable(DataGridView dataGridView, Lookup type_Lookup, Dictionary type_dictionary, string strNewStyle, string strOldStyle, string strID, string strCount) { int row = 0; DataTable dt = new DataTable(); dt.Columns.Add(strOldStyle, typeof(string)); dt.Columns.Add(strID, typeof(string)); dt.Columns.Add(strCount, typeof(int)); dt.Columns.Add("combobox", typeof(DataGridViewComboBoxCell)); //Add All Doc Types to ComboBoxes DataGridViewComboBoxCell CmBx = new DataGridViewComboBoxCell(); CmBx.DataSource = new BindingSource(type_dictionary, null); CmBx.DisplayMember = "Value"; CmBx.ValueMember = "Key"; //Add Style Comboboxes DataGridViewComboBoxColumn Data_CmBx_Col = new DataGridViewComboBoxColumn(); Data_CmBx_Col.HeaderText = strNewStyle; dataGridView.Columns.Add(addDataGrdViewComboBox(Data_CmBx_Col, type_dictionary)); setCellComboBoxItems(dataGridView, 1, 3, CmBx); //Add style Rows foreach (IGrouping StyleGroup in type_Lookup) { row++; //Iterate through each group in the Igrouping //Add Style Rows dt.Rows.Add(StyleGroup.Key, row, StyleGroup.Count().ToString()); } return dt; } private void setCellComboBoxItems(DataGridView dataGrid, int rowIndex, int colIndex, DataGridViewComboBoxCell CmBx) { DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell)dataGrid.Rows[rowIndex].Cells[colIndex]; // You might pass a boolean to determine whether to clear or not. dgvcbc.Items.Clear(); foreach (DataGridViewComboBoxCell itemToAdd in CmBx.Items) { dgvcbc.Items.Add(itemToAdd); }