2008-09-18 38 views
12

Tôi đang xây dựng một bảng bằng cách sử dụng DataGridView nơi người dùng có thể chọn các mục từ một menu thả xuống trong mỗi ô. Để đơn giản hóa vấn đề, hãy nói rằng tôi có 1 cột. Tôi đang sử dụng DataGridViewComboBoxColumn trong thiết kế. Tôi đang cố gắng hỗ trợ có mỗi hàng trong cột đó có một danh sách các mục khác nhau để lựa chọn.DataGridViewComboBoxColumn thêm các mục khác nhau vào mỗi hàng.

Điều này có khả thi không?

Trả lời

16

Có. Điều này có thể được thực hiện bằng cách sử dụng DataGridViewComboBoxCell.

Dưới đây là một phương pháp mẫu để thêm các mục vào chỉ một ô, chứ không phải toàn bộ cột.

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); 
    } 
} 
+0

Mã này làm việc tuyệt vời cho một dự án mà tôi đang làm việc trên. –

2
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
{ 
    if (e.ColumnIndex == DataGridViewComboBoxColumnNumber) 
    { 
     setCellComboBoxItems(myDataGridView, e.RowIndex, e.ColumnIndex, someObj); 
    } 
} 
1

Chỉ trong trường hợp có ai tìm thấy chủ đề này, đây là giải pháp của tôi trong VB 2008. Ưu điểm này cung cấp là nó cho phép bạn gán một ID để mỗi giá trị trong combobox.

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 
0

đây là một ví dụ với GridView có 2 comboboxColumns và khi một chỉ số comboBoxColumns1 chọn thay đổi sau đó tải comboBoxColumns2 với dữ liệu từ từ hai cột khác nhau từ cơ sở dữ liệu.

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(); 
       } 
      } 
-1
//Populate the Datatable with the Lookup lists 
    private DataTable typeDataTable(DataGridView dataGridView, Lookup<string, Element> type_Lookup, Dictionary<Element, string> 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<string, Element> 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); 
     } 
+1

Tôi khuyên bạn nên cung cấp giải thích cho mẫu mã của bạn. – Wtower

Các vấn đề liên quan