2015-12-26 49 views
3

我知道这个问题是如此古老,曾被问过很多次,但我没有找到我想要的确切的东西。 我曾经有一些组合框和文本框,用户将填写并逐个选择数据,并在输入按最后一个框时,所有数据都作为新行添加到数据网格中。 现在我想要的是使我的datagrid中的第一行替换所有这些框。 但我已经停留在第一项。Datagrid视图组合框查看vb.net

我想第一列是一个组合框,但它从基于我写的查询的SQL数据库中获取它的值。在组合框中,我想输入我想要搜索并选择的内容(作为正常组合框中的下拉样式)。


类似下面的代码,但对于datagridview中的组合框。

Dim sqlquery = " SELECT m.accno,m.accname 
       FROM masteraccount m 
       where accname like '%TextBox3.Text%' 
        or accno like '%TextBox3.Text%' " 

     Using comm As SqlCommand = New SqlCommand(sqlquery, SQL.SQLCon) 
      Dim rs As SqlDataReader = comm.ExecuteReader 
      Dim dt As DataTable = New DataTable 
      dt.Load(rs) 
      ListBox1.DataSource = dt 
      ComboBox1.DisplayMember = "acc" 
      ComboBox1.ValueMember = "acc" 

     End Using 
+0

您必须添加一列作为组合框。我相信你可以在这里找到足够的例子stackoverflow.com – etalon11

+0

是的,但没有人显示我可以如何处理sql关系,因为我想要的。 – BigDreamer

回答

1

我根据您的要求更改了代码。当您从组合框中键入或选择项目时,它会填充其他单元格。两种方法都具有相同的功能。检查下面修改的代码。

Private Sub FillComboBox() 
    If cn.State = ConnectionState.Open Then cn.Close() 
    cn.ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Juan\Documents\NorthwindSample.accdb;Persist Security Info=False;" 
    cn.Open() 

    cmb.Name = "cmb" 
    cmb.HeaderText = "Employee" 

    'query that retrieves all the employee names 
    Dim sqlquery As String = "Select [last name] & ' ' & [first name] as Name " & 
      "From employees order by [last name]" 

    'add the query results to the combobox cell in datagridview 
    Using comm As OleDbCommand = New OleDbCommand(sqlquery, cn) 
     Dim rs As OleDbDataReader = comm.ExecuteReader 
     dtable = New DataTable 
     dtable.Load(rs) 
     cmb.DataSource = dtable 
     cmb.DisplayMember = dtable.Columns.Item(0).ColumnName 
     cmb.ValueMember = dtable.Columns.Item(0).ColumnName 
     DataGridView1.Columns.Add(cmb) 
    End Using 

    'create other columns 
    CreateColumns() 
End Sub 
'Procedure to fill the other cells 
Sub FillCells(cmbValue As String, conn As OleDbConnection) 

    'query that retrieves the rest of the fields that matches with the combobox value 
    Dim sqlquery2 As String = "Select [Last Name] & ' ' & [First Name] as Name, [e-mail address], [job title], city 
      From employees 
    Where [Last Name] & ' ' & [First Name] = '" & cmbValue & "'" 

    'Assigns query results to datatable 
    Using comm2 As OleDbCommand = New OleDbCommand(sqlquery2, conn) 
     Dim rs As OleDbDataReader = comm2.ExecuteReader 
     Dim dt As DataTable = New DataTable 
     dt.Load(rs) 

     'creates a datarow for the datatable 
     Dim dtRow As DataRow 

     Dim email As String = "" 
     Dim jobtitle As String = "" 
     Dim city As String = "" 

     'assigns datarow items to variables 

     For Each dtRow In dt.Rows 

      dtRow.Field(Of String)(dt.Columns.Item(1)) 
      email = dtRow.Item(1) 
      jobtitle = dtRow.Item(2) 
      city = dtRow.Item(3) 

     Next 

     'assigns the index of the current row to the variable 
     Dim currentRow As Integer 

     currentRow = DataGridView1.CurrentRow.Index 

     'fills the cells with the values 
     DataGridView1.Item(1, currentRow).Value = email 
     DataGridView1.Item(2, currentRow).Value = jobtitle 
     DataGridView1.Item(3, currentRow).Value = city 
     dt = Nothing 
    End Using 

End Sub 

Private Sub DataGridView1_EditingControlShowing(sender As Object, 
     e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing 

    'REMEMBER TO CHANGE THE COLUMN INDEX NUMBER TO YOUR COMBOBOX INDEX!! 
    If DataGridView1.CurrentCell.ColumnIndex = 0 Then 
     Dim combo As ComboBox = CType(e.Control, ComboBox) 
     combo.DropDownStyle = ComboBoxStyle.DropDown 

     If (combo IsNot Nothing) Then 
      ' Remove an existing event-handler, if present, to avoid adding multiple handlers when the editing control is reused. 
      RemoveHandler combo.SelectionChangeCommitted, New EventHandler(AddressOf ComboBox_SelectionChangeCommitted) 
      RemoveHandler combo.TextChanged, New EventHandler(AddressOf ComboBox_TextChanged) 
      RemoveHandler combo.KeyDown, New KeyEventHandler(AddressOf ComboBox_KeyDown) 

      ' Add the event handler. 
      AddHandler combo.SelectionChangeCommitted, New EventHandler(AddressOf ComboBox_SelectionChangeCommitted) 
      AddHandler combo.TextChanged, New EventHandler(AddressOf ComboBox_TextChanged) 
      AddHandler combo.KeyDown, New KeyEventHandler(AddressOf ComboBox_KeyDown) 
     End If 
    End If 
End Sub 

Private Sub ComboBox_SelectionChangeCommitted(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Dim combo As ComboBox = CType(sender, ComboBox) 
    FillCells(combo.Text, cn) 
End Sub 
Private Sub ComboBox_TextChanged(sender As Object, 
       e As EventArgs) 
    Dim combo As ComboBox = CType(sender, ComboBox) 
    FillCells(combo.Text, cn) 
End Sub 

Private Sub ComboBox_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) 
    Select Case (e.KeyCode) 
     Case Keys.Tab 
      e.Equals(Keys.Return) 
    End Select 
End Sub 
+0

感谢它比其他代码更好,但仍然无法搜索组合框。 如果你有1000名员工,我想根据什么我显示他们(检索所有员工姓名的查询 Dim sqlquery As String =“Select [lastname] and [first name] where'firstname] like'combobox。文字%'“ – BigDreamer