我有一個 Combobox1 表單,其中加載了資料庫中的值。這些值完美地加載到 Combobox1 中。在更新學生資訊的程序中,我在 datagridview 中有一行有一個“編輯”按鈕,當我單擊“編輯”按鈕時,它會顯示一個帶有文本框和組合框的表單,其中加載了所有值來自 Datagridview 行,與該特定學生有關。在表單加載事件中,我將資料從資料庫加載到該 Combobox1。當表單顯示時,Combobox1 顯示資料庫查詢中的第一項,而不是我選擇傳遞給 Combobox1 的 Datagridview 中的值,即使它們與查詢中的專案相同。
這是獲取資料的代碼
Public Sub LoadSections(cb As ComboBox)
Try
sql = "SELECT ID, section_name FROM slm_sections WHERE school_id = @SCHOOLID ORDER BY section_name ASC"
dbconnect()
conn.Open()
cmd = New MySqlCommand(sql, conn)
cmd.Parameters.AddWithValue("@SCHOOLID", My.Settings.SchoolID)
Dim adptr As New MySqlDataAdapter(cmd)
Dim table As New DataTable()
adptr.Fill(table)
cb.DataSource = New BindingSource(table, Nothing)
cb.DisplayMember = "section_name"
cb.ValueMember = "ID"
cmd.Dispose()
adptr.Dispose()
conn.Close()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
在將值從 datagridview 傳遞到 Combobox1 時,這是我的代碼
Dim frm2 As New FormAddNewStudent
With frm2
frm2.Text = "Update Student Info"
LoadGradeLevels(.CbGradeLevel)
LoadSections(.CbSection)
LoadStrands(.CbStrand)
.TxtLastName.Text = StudentList.SelectedCells(5).Value.ToString
.TxtFirstName.Text = StudentList.SelectedCells(6).Value.ToString
.TxtMiddleName.Text = StudentList.SelectedCells(7).Value.ToString
.TxtLRN.Text = StudentList.SelectedCells(8).Value.ToString
.CbGender.SelectedItem = StudentList.SelectedCells(9).Value.ToString
.CbGradeLevel.SelectedItem = StudentList.SelectedCells(10).Value.ToString
.CbSection.SelectedItem = StudentList.SelectedCells(11).Value.ToString
.CbStrand.SelectedItem = StudentList.SelectedCells(12).Value.ToString
.BtnSave.Text = "Update"
End With
frm2.ShowDialog()
Studentlist 是 Datagridview,StudentList.SelectedCells(1).Value.ToString 是我需要加載到 Combobox1 中的資料。
uj5u.com熱心網友回復:
它進展順利,您開始使用其選定的單元格集合從 DataGridView 中挖掘資料 - 此時“代碼正在使用資料系結;它通過資料模型執行資料操作”崩潰了。
我認為最簡單的做法是安排編輯表單上的所有控制元件,使它們系結到同一個系結源 X,然后將網格系結到的系結源 Y 傳遞給第二個表單并將 X 系結到 Y . 形象地說,我們將安排如下:

主表單將有一個網格,系結到一個 BS,系結到一個資料表。第二種形式將控制元件系結到系結到主表單的 BS 的 BS。編輯表單上的組合從單獨的資料源獲取其串列項,并使用它們來更改主表中學生部分的 ID
撰寫系結代碼是重復的并且相當無聊,所以我將快速介紹如何讓 Windows 表單設計器來完成它,我將介紹一些讓你撰寫 SQL/將東西取出/保存到的內容資料庫也更容易:
(提前說明,這里的程序只能在 .net 框架上正常作業;如果您的專案是 .net 核心,您會遇到困難,因為資料系結設計在 net core 中非常破碎/不完整)
- 將 DataSet 型別的檔案添加到專案中
- 打開它,右鍵單擊表面并選擇添加 TableAdapter
- 設定連接字串,輸入提取學生資料的查詢,完成向導。從現在開始,我將把它稱為“學生”資料表(我不知道它在你的資料庫中叫什么)
- 再次右鍵表面,添加TableAdapter,相同的conn str,查詢
SELECT ID, section_name FROM slm_sections WHERE school_id = @SCHOOLID ORDER BY section_name ASC完成。我將其稱為 Sections 資料表 - 轉到新表單(以避免干擾現有代碼)并打開“資料源”視窗(查看選單、其他視窗)
- 將 Student 節點拖到表單中。有些東西出現在表格的托盤、頁眉和網格中
- 制作一個新表格
- 將 Student 節點下拉到 Data Sources 中并將其從 Grid 更改為 Details
- 將部分(在學生下)從文本框更改為組合框
- 將Student節點拖到表單中,出現多個控制元件都系結到同一個bindingsource
- 將 Section 節點拖到表單中,但洗掉它制作的網格 - 我們不需要它,但我們確實需要它制作的其他一些東西
- 在組合上:
- 將 DataSource 設定為 SectionBindingSource
- 適當設定 Display/Value 成員
- 在屬性網格頂部展開 (DataBindings) 并查看為 Text 系結的內容 - 在 SelectedValue 中進行相同的操作,然后右鍵單擊 Text 并選擇 Reset(Text 系結錯誤,它需要是系結到的 SelectedValue學生.SectionID)
- 轉到此表單 2 上的代碼視圖
- 洗掉 Load 事件中的填充代碼 - 我們不需要它們,因為我們將重用主表單下載的資料
- 放置一個建構式,我們可以將 BindingSource 發送到:
Public Sub New(toUse As BindingSource)
InitializeComponent()
StudentsBindingSource.DataMember = Nothing
StudentsBindingSource.DataSource = toUse
End Sub
- 在主表單中更改顯示編輯表單的代碼,以便將 StudentBindingSource從主表單發送到編輯表單:
Dim f as New ...WhateverForm(StudentsBindingSource)
f.Show()
編輯表單將接收 bindingsource 并將其自己的 bindingsource 系結到它,將兩者鏈接在一起。這意味著編輯表單上的控制元件將從主表單讀取資料/將資料推送到資料集/資料表/系結源中,因此網格和控制元件都可以從單一資料源讀取和編輯
現在,您不必做所有這些,制作資料集和表格配接器 - 系結部分不依賴于這些,只是通過從資料源視窗拖放來撰寫系結代碼很容易
您可以查看上面建議的后半部分,以 eidt 形式創建一個接受 BS 的建構式,傳遞一個 BS,然后在該建構式中,您可以將編輯表單的 Section 組合設定為具有如下系結:
Me.SectionComboBox.DataBindings.Add(New Binding("SelectedValue", toUse, "SectionId", True))
加上將其他內容(資料源/disp/val)設定為現有資料串列(您清楚地知道如何從資料庫中獲取某些部分),這意味著編輯表單的組合將直接從主表單系結到 BS。他們是鏈式的還是直接的并不重要。我將它們與表單設計器創建的東西鏈接起來,因為它比將表單上的每個控制元件重新系結到toUse從 main 傳遞的 bindingsource更容易
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/430845.html
下一篇:在vb.net的gridviewdevexpress中單擊時如何在pictureedit和picturebox中顯示影像
