我有一个带数据源的数据网格视图和一个Acces表。 datagridview已经填满并完美,但现在我想创建一个带有过滤器可能性的额外Combobox。
这是我的页面加载功能:
Private Sub ArchiefFacturatie_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'TODO: This line of code loads data into the 'CharelIjsDataSet.tblFactuur' table. You can move, or remove it, as needed.
Me.TblFactuurTableAdapter.Fill(Me.CharelIjsDataSet.tblFactuur)
'Filling comboxbox part skipped
End Sub
此时组合框也填充了数据网格视图。 现在我在组合框上创建了一个on selectChange动作。
我不知道如何解决这个问题但是我已经尝试过了:
Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted
'Ophalen id artikel
Dim klantid As Integer
klantid = ComboBox1.SelectedValue
Dim klantidstr As String
klantidstr = klantid.ToString
'Via query overige gegevens ophalen
' OLEDB select query
Dim myConnection As OleDbConnection
Dim DBpath As String = "C:\Facturatie\CharelIjs.accdb"
Dim sConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & DBpath & ";Persist Security Info=True"
myConnection = New OleDbConnection(sConnectionString)
myConnection.Open()
Dim SQLstr As String
SQLstr = "SELECT * FROM tblKlant WHERE KlantID = @id"
Dim cmd As New OleDbCommand(SQLstr, myConnection)
Dim da As New OleDbDataAdapter(cmd)
Dim ds As New DataSet()
cmd.Parameters.Add("@id", OleDbType.VarChar)
cmd.Parameters(0).Value = klantid
Try
da.Fill(ds, "tblKlant")
cmd.ExecuteNonQuery()
Catch ex As Exception
MsgBox("Can't load Web page" & vbCrLf & ex.Message)
Return
End Try
DataGridView1.DataSource = ds.Tables("tblKlant")
End Sub
答案 0 :(得分:0)
您可以在SelectionChangeCommitted
事件处理程序中删除所有代码以获取开始。您有一个键入的DataSet
所以请使用它。双击解决方案资源管理器中的DataSet,打开DataSet设计器。你应该有一个TblKlantTableAdapter
适配器。右键单击它并添加新查询。添加已过滤的查询,并将方法命名为FillByKlantID
和GetDataByKlantID
。
返回表单设计器,添加表适配器实例和BindingSource。将BindingSource
绑定到DataSet
中的tblKlant,然后将网格绑定到BindingSource
。现在,当用户进行选择时,您首先清除DataSet
中的表格,然后从ComboBox
获取ID并将其传递给对该FillByKlantID
方法的调用。这将从数据库中获取过滤后的数据并填充DataTable
。由于DataTable
绑定到BindingSource
并且绑定到网格,因此将显示数据。