2008-10-27 14 views
18

Tôi có một DataGridView với một DataGridViewComboBoxColumn trong ứng dụng WinForms của tôi. Tôi cần phải thả xuống (mở) DataGridViewComboBoxColumn này bằng tay, giả sử sau khi một nút được nhấp.Làm thế nào để tự thả xuống một DataGridViewComboBoxColumn?

Lý do tôi cần điều này là tôi đã đặt SelectionMode thành FullRowSelect và tôi cần nhấp 2-3 lần để mở hộp tổ hợp. Tôi muốn nhấp vào ô combobox và nó sẽ thả xuống ngay lập tức. Tôi muốn làm điều này với sự kiện CellClick, hoặc có cách nào khác không?

Tôi đang tìm kiếm trợ giúp của Google và VS, nhưng tôi chưa tìm thấy bất kỳ thông tin nào.

Ai đó có thể giúp bạn không?

Trả lời

22

Tôi biết điều này không thể là giải pháp lý tưởng nhưng nó tạo ra một hộp kết hợp nhấp chuột duy nhất hoạt động bên trong ô.

Private Sub cell_Click(ByVal sender As System.Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick 
     DataGridView1.BeginEdit(True) 
     If DataGridView1.Rows(e.RowIndex).Cells(ddl.Name).Selected = True Then 
      DirectCast(DataGridView1.EditingControl, DataGridViewComboBoxEditingControl).DroppedDown = True 
     End If 
    End Sub 

trong đó "ddl" là ô combobox tôi đã thêm trong chế độ xem lưới.

10

tôi đã có thể để có được gần với những gì bạn đang tìm kiếm bằng cách thiết lập

DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter 

Chừng nào thả xuống không khác tế bào được thể hiện nó sẽ hiển thị danh sách thả xuống các ô đã chọn ngay lập tức.

Tôi sẽ tiếp tục suy nghĩ và cập nhật nếu có gì xảy ra.

15

Cảm ơn ThisMat, giải pháp của bạn hoạt động hoàn hảo.

Mã của tôi trong C#:

private void dataGridViewWeighings_CellClick(object sender, DataGridViewCellEventArgs e) { 
    if (e.RowIndex < 0) { 
     return;  // Header 
    } 
    if (e.ColumnIndex != 5) { 
     return;  // Filter out other columns 
    } 

    dataGridViewWeighings.BeginEdit(true); 
    ComboBox comboBox = (ComboBox)dataGridViewWeighings.EditingControl; 
    comboBox.DroppedDown = true; 
} 
+0

Tôi rất vui vì bạn đã nhận nó làm việc! – thismat

+0

Điều này thật hữu ích. – BrianH

2

Cảm ơn các phiên bản C#. Đây là đóng góp của tôi để tìm kiếm theo tên cột kết hợp:

private void dgv_CellClick(object sender, DataGridViewCellEventArgs e) 
{ 
    string Weekdays = @"MondayTuesdayWednesdayThursdayFridaySaturdaySunday"; 
    if (Weekdays.IndexOf(dgv.Columns[e.ColumnIndex].Name) != -1) 
    { 
     dgv.BeginEdit(true); 
     ComboBox comboBox = (ComboBox)dgv.EditingControl; 
     comboBox.DroppedDown = true; 
    } 
} 
1

Tôi cũng đang tìm câu trả lời cho điều này. Tôi đã kết thúc viết một phụ chung mà có thể được gọi từ bất kỳ DataGridView kể từ khi tôi đã có rất nhiều trong các ứng dụng của tôi và tôi muốn tất cả họ cư xử theo cùng một cách. Điều này làm việc tốt cho tôi vì vậy tôi muốn chia sẻ nó với bất cứ ai khác tình cờ gặp bài đăng này.

Trong trường hợp mouseclick cho DGV tôi thêm mã

Private Sub SomeGrid_MouseClick(sender As Object, e As MouseEventArgs) Handles SomeGrid.MouseClick 
    DGV_MouseClick(sender, e) 
End Sub 

nào gọi là tiểu sau đó tôi lưu trữ trong một module chia sẻ

Public Sub DGV_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    Try 
     Dim dgv As DataGridView = sender 
     Dim h As DataGridView.HitTestInfo = dgv.HitTest(e.X, e.Y) 
     If h.RowIndex > -1 AndAlso h.ColumnIndex > -1 AndAlso dgv.Columns(h.ColumnIndex).CellType Is GetType(DataGridViewComboBoxCell) Then 
      Dim cell As DataGridViewComboBoxCell = dgv.Rows(h.RowIndex).Cells(h.ColumnIndex) 
      If Not dgv.CurrentCell Is cell Then dgv.CurrentCell = cell 
      If Not dgv.IsCurrentCellInEditMode Then 
       dgv.BeginEdit(True) 
       CType(dgv.EditingControl, ComboBox).DroppedDown = True 
      End If 
     End If 
    Catch ex As Exception 
    End Try 
End Sub 

Tôi chưa bao giờ bắt gặp bất kỳ lỗi nào, tôi chỉ bao gồm các Try..Catch mã cho một số trường hợp hiếm hoi tôi không thể nghĩ rằng có thể ném một ngoại lệ. Tôi không muốn người dùng bị làm phiền bởi các thông báo lỗi cho kịch bản này. Nếu phụ không thành công, thì rất có thể DGV sẽ hoạt động như bình thường.