2015-12-26 2 views
3

Я знаю, что этот вопрос настолько стар и был задан так много раз, но я не нашел точной вещи, которую хочу. У меня были некоторые комбобокс и текстовые поля, которые пользователь будет заполнять и выбирать данные один за другим, а при вводе нажать на последнем поле, все данные добавляются как новая строка в datagrid. теперь я хочу, чтобы первая строка в моем datagrid заменила все эти поля. , но я уже застрял на первом предмете.Комбобокс в представлении Datagrid vb.net

Я хочу, чтобы первый столбец был combobox, но он получает свои значения из базы данных SQL на основе запроса, который я пишу. в combobox я хочу ввести то, что я хочу найти и выбрать (как стиль выпадающего списка в обычном combobox).


Что-то вроде кода ниже, но для выпадающего списка в 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

Вы должны добавить столбец в виде combobox. Я уверен, что вы можете найти достаточно примеров здесь, на 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

Спасибо, что он работал лучше, чем другие коды, но все же не мог найти через combobox. Если у вас 1000 сотрудников, я хочу показать их в соответствии с тем, что я набираю (запрос, который извлекает все имена сотрудников Dim sqlquery As String = «Выберите [фамилию] и [имя], где [firstname], как« combobox. текст% '" – BigDreamer

Смежные вопросы