![](/img/trans.png)
[英]VB.net DataGridView not display the Data from MySql Data base
[英]Problem in Data display from database using datagridview in vb.net
Im using vb.net windows forms, VS 2019, .net framework 4.7.2 and mysql.
我嘗試了 datagridview 以顯示我的數據庫中的數據,並且它工作得很好。
但,
當我嘗試使用相同的過程,使用子窗體中的 datagridview 顯示來自同一數據庫的數據時(我通過父窗體調用,它將子窗體停靠在父窗體中的區域上),它不顯示任何數據,而查詢工作得很好,它更新了數據庫中的數據,但是在這個父子案例中數據沒有顯示。
Tho,相同的代碼工作得很好,如果它以單獨的形式使用,它會顯示數據。
我不知道實際上是什么問題。
我必須附上不止一張圖片才能清楚地解釋,所以我上傳了它們,鏈接如下:
但是,我也合並了來自不同 forms 的所有代碼片段:
1 子類 Custom_LoadDataGrid 在這里被調用並正常工作並在 gridview 中顯示數據
DB.Custom_LoadDataGrid("SELECT item_name as 'NAME', item_price as 'PRICE', quantity as 'QUANTITY', Amount as 'AMOUNT' FROM transaction WHERE client_name ='" + Label11.Text.ToString + "'")
DB.myConnection.Close()
2 上面調用的子Custom_LoadDataGrid
Public Sub Custom_LoadDataGrid(ByVal search As String)
Try
connString = "server=127.0.0.1;Port=3306;Database=smartcart;Uid=root;Pwd="
myConnection.ConnectionString = connString
myConnection.Open()
sql = search.ToString
DataAdapter = New MySqlDataAdapter(sql, myConnection)
Datacmd = New MySqlCommand(sql, myConnection)
DataAdapter.Fill(DataSet, DbName)
MaxRows = DataSet.Tables(DbName).Rows.Count
Dim dt1 As New DataTable
DataSet.Tables.Add(dt1)
DataAdapter.Fill(dt1)
Portal.Guna2DataGridView1.DataSource = dt1.DefaultView
ReleaseDb()
Catch ex As Exception
MsgBox("Something went wrong")
End Try
End Sub
3 我創建了這個子類來調用子 forms 並停靠在父 forms 某處的區域中
Private Sub OpenChildForm(childForm As Form)
'Open only form'
If currentChildForm IsNot Nothing Then
currentChildForm.Close()
End If
currentChildForm = childForm
'end'
childForm.TopLevel = False
childForm.FormBorderStyle = FormBorderStyle.None
childForm.Dock = DockStyle.Fill
Controls_panel.Controls.Add(childForm)
Controls_panel.Tag = childForm
childForm.BringToFront()
childForm.Show()
End Sub
4 這里子窗體叫做
Private Sub Stock_manag_button_Click(sender As Object, e As EventArgs) Handles Stock_manag_button.Click
Sub_menu_panel.Hide()
ActivateButton(sender)
OpenChildForm(New Stock_management)
End Sub
5 這個子類 Custom_Load_DataGrid 在這里被調用但是沒有在 gridview 中顯示數據
DB.Custom_Load_DataGrid("SELECT * FROM addition_stock ")
DB.myConnection.Close()
'6 子類 Custom_Load_DataGrid 與 Custom_LoadDataGrid 完全相同(但顯然具有不同的變量和相關的表單名稱),但這不是在 gridview 中顯示數據,只是在這種父子 forms 的情況下,這個在用於單獨的 forms。
Public Sub Custom_Load_DataGrid(ByVal search As String)
Try
connString = "server=127.0.0.1;Port=3306;Database=smartcart;Uid=root;Pwd="
myConnection.ConnectionString = connString
myConnection.Open()
sql = search.ToString
DataAdapter = New MySqlDataAdapter(sql, myConnection)
Datacmd = New MySqlCommand(sql, myConnection)
DataAdapter.Fill(DataSet, DbName)
MaxRows = DataSet.Tables(DbName).Rows.Count
MsgBox(MaxRows.ToString)
Dim dt2 As New DataTable
DataSet.Tables.Add(dt2)
DataAdapter.Fill(dt2)
Stock_addition.Guna2DataGridView1.DataSource = dt2.DefaultView
ReleaseDb()
Catch ex As Exception
MsgBox("Something went wrong")
End Try
End Sub
我可以讓你在一個新項目中這樣做,作為一個迷你教程,讓你的生活更輕松:
SELECT * FROM addition_stock WHERE ID = @id
你會看到一個看起來像數據庫表的東西,在它下面有一個名為addition_stockTableAdapter的東西
SELECT * FROM addition_stock WHERE stock_code = @stockCode
始終將創建數據表/表適配器對的第一個查詢設置為“select where id =” - 它使以后的事情變得更容易。 根據需要添加盡可能多的其他查詢
再次做同樣的事情(添加一個 tableadapter)這次使用一個作為additional_stock 的父級或子級的表 - 哪個都沒有關系,我只是想在這里演示一些東西。 確保使用在數據庫中具有外鍵的表添加到存貨
添加與addition_stock相關的其他數據表/表適配器對后,您將看到一條連接兩個數據表的線
現在我們要添加一個方便的方法來根據父 id 加載子數據
添加查詢SELECT * FROM tablenamehere WHERE parentidcolumnnamehere = @parentid
並稱其為合適的 FillByXxx - 顯然將表名、列名和 xxx 替換為真實值
保存您的數據集並切換到 forms 設計器
在通過 id 填充父數據表的代碼行下放置以下代碼:
childTableAdapter.ClearBeforeFill = False yourDatasetName.ChildTableName.Clear() For Each parentRow in yourDataSetName.YourParentTableName childTableAdapter.FillByParentId(yourDataSetName.ChildTableName, parentRow.Id) Next
再次運行app,輸入父id,點擊填充。 加載父數據和相關的子數據。 很好,但真正的魔法發生在我們加載多個父行時。 Go back to code and swap the FillById on the parent tableadapter for the other query you write (if you didn't do one, go back to DataSet, Add a query to the parent table adapter that loads multiple rows, like select * from person where lastname = @lastname
所以我們可以輸入一個姓氏,比如 smith,其中有很多)所以現在你的代碼在填充中看起來像這樣:
parentTableAdapter.FillBySonethingThatGetsMultipleRows(yourDataSetName.ParentTableName, fillByTextboxName.Text)
childTableAdapter.ClearBeforeFill = False
yourDatasetName.ChildTableName.Clear()
For Each parentRow in yourDataSetName.YourParentTableName
childTableAdapter.FillByParentId(yourDataSetName.ChildTableName, parentRow.Id)
Next
您會注意到您獲得了多個父行,您在循環中加載了多組子行,但是當您運行應用程序並在父網格中選擇不同的父網格時,子網格會自動過濾以僅顯示當前選擇的父母
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.