簡體   English   中英

使用 vb.net 中的 datagridview 從數據庫顯示數據的問題

[英]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,相同的代碼工作得很好,如果它以單獨的形式使用,它會顯示數據。

我不知道實際上是什么問題。

我必須附上不止一張圖片才能清楚地解釋,所以我上傳了它們,鏈接如下:

https://imgur.com/a/6xka1B4

但是,我也合並了來自不同 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

我可以讓你在一個新項目中這樣做,作為一個迷你教程,讓你的生活更輕松:

  • 做一個新項目
  • 添加表單
  • 添加數據集
  • 打開DataSet,在surface中右擊並添加一個tableadapter
  • create a connection string to store in the settings: Pick mysql connector (note for this to work you need mysql connector AND ALSO mysql for visual studio https://dev.mysql.com/downloads/windows/visualstudio/ ) and fill in the創建數據庫連接字符串的詳細信息確保測試連接成功
  • 通過向導選擇“返回行的查詢”、“按 sql”,輸入查詢SELECT * FROM addition_stock WHERE ID = @id
  • 寫入 FillByID 和 GetDataByID 的名稱
  • 結束

你會看到一個看起來像數據庫表的東西,在它下面有一個名為addition_stockTableAdapter的東西

  • 右鍵單擊 tableadapter,選擇 add.. 查詢
  • 添加另一個與您將如何搜索此表更相關的查詢,例如SELECT * FROM addition_stock WHERE stock_code = @stockCode
  • 稱之為 FillByStockCode/GetDataByStockCode
  • 始終為您的填充/獲取數據方法提供相關名稱

始終將創建數據表/表適配器對的第一個查詢設置為“select where id =” - 它使以后的事情變得更容易。 根據需要添加盡可能多的其他查詢

再次做同樣的事情(添加一個 tableadapter)這次使用一個作為additional_stock 的父級或子級的表 - 哪個都沒有關系,我只是想在這里演示一些東西。 確保使用在數據庫中具有外鍵的表添加到存貨

添加與addition_stock相關的其他數據表/表適配器對后,您將看到一條連接兩個數據表的線

  • 右鍵單擊此行並選擇“顯示關系標簽”以顯示關系的名稱 - 它來自數據庫中的外鍵

現在我們要添加一個方便的方法來根據父 id 加載子數據

  • 右鍵單擊您的子表適配器並選擇添加查詢
  • 添加查詢SELECT * FROM tablenamehere WHERE parentidcolumnnamehere = @parentid並稱其為合適的 FillByXxx - 顯然將表名、列名和 xxx 替換為真實值

  • 保存您的數據集並切換到 forms 設計器

  • 顯示數據源 window(查看菜單.. 其他窗口)
  • 展開 DataSet 的所有節點 - 您會看到一個父表和兩個子表,一個在父表下方,一個不在
  • 將父表拖出數據源並拖到表單上 - 將出現一個帶有列的 datagridview,以及底部托盤中的 tableadapter、bindingnavigator、DataSet 和 bindingsource。 導航有一個文本框,您可以在其中寫入一個 id 和一個按鈕來按下。 datagridview 列已正確設置,並且網格綁定到綁定源。 bindingsource 綁定到 DataSet 父表。
  • 運行應用程序,在文本框中輸入 ID,單擊填充,編輯名稱,單擊保存,go 使用 mysql 工作台查看數據庫。 極好的; 您可以下載、編輯和保存數據庫數據,而且您還沒有編寫任何代碼; 您只是在使用 Visual Studio 為您編寫的數千行代碼。
  • 停止應用程序,go 回到 forms 設計器
  • 將父表下方的子表拖到窗體上。 出現更多項目 - 綁定到另一個綁定源、另一個導航器等的 datagridview。您可以刪除第二個導航器 - 我們不會使用它
  • 查看子表的 bindingsource - 請注意,它沒有直接綁定到 DataSet,而是綁定到另一個 bindingsource,其中 DataMember 屬性設置為兩個表之間的關系線的名稱
  • 切換到代碼視圖並查看通過 id/whatever 填充父記錄的填充工具條菜單的代碼。 如果子綁定導航器中有任何冗余代碼,請將其刪除(或將其注釋掉:它可能對下一步有點用處
  • 在通過 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM