[英]datagridview values remove from another datagridview
我有兩個數據網格視圖。 一個是 dtgridPopulate 並使用來自數據庫的數據進行填充。
dtgridPopulate 列是(復選框、代碼、名稱)
復選框 | 代碼 | 姓名 |
---|---|---|
復選框圖標 | c1 | customer_one |
然后第二個 datagridview 是 dtgridGenerate,它從 dtgridPopulate 生成了值。 我使用代碼dtgridPopulate.Rows.Add(code, name)
手動將 dtgridPopulate 中的值添加到 dtgridGenerate。
dtgridGenerate 列是(代碼,名稱)
代碼 | 姓名 |
---|---|
c1 | customer_one |
當我選中 dtgridPopulate 中的復選框時,它會將值(代碼、名稱)傳輸到 dtgridGenerate。 但問題是當我取消選中 dtgridPopulate 中的復選框時,它還應該刪除dtgridGenerate 中的值。
Private Sub dtgridPopulateSelectAll_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles dtgridPopulate.CurrentCellDirtyStateChanged
RemoveHandler dtgridPopulate.CurrentCellDirtyStateChanged, AddressOf dtgridPopulateSelectAll_CurrentCellDirtyStateChanged
If TypeOf dtgridPopulate.CurrentCell Is DataGridViewCheckBoxCell Then
dtgridPopulate.EndEdit()
Dim Checked As Boolean = CType(dtgridPopulate.CurrentCell.Value, Boolean)
If Checked Then
code = dtgridPopulate.CurrentRow.Cells(1).Value.ToString
name = dtgridPopulate.CurrentRow.Cells(2).Value.ToString
dtgridGenerate.Rows.Add(code, name)
Else
For Each drow As DataGridViewRow In dtgridPopulate.SelectedRows 'This is for uncheck but it doens't work
dtgridGenerate.Rows.Remove(row)
Next
End If
End If
AddHandler dtgridPopulate.CurrentCellDirtyStateChanged, AddressOf dtgridPopulateSelectAll_CurrentCellDirtyStateChanged
End Sub
我參考這個參考
取消選中復選框時出錯:提供的行不屬於此 datagridview 控件。 參數名稱:datagridviewrow
我不確定您“為什么”取消訂閱然后又重新訂閱了該活動。 通常,僅當事件中的代碼“更改”網格中的某些內容而導致事件重新觸發並且當前代碼中沒有發生這種情況時才需要這樣做。 也不需要結束網格編輯。
此外,您對網格CurrentCellDirtyStateChanged
事件的使用與您想要做的事情有一個缺點……如果用戶一遍又一遍地選中和取消選中同一個單元格,它不會重新觸發。 換句話說,如果用戶單擊復選框單元格並且復選框變為選中狀態並且事件觸發......那么......如果用戶在單擊任何其他單元格之前“取消選中”同一個單元格,那么事件將不會重新觸發。
此外,該事件似乎使用了與事件簽名不同的網格... dtgridPopulateSelectAll_CurrentCellDirtyStateChanged
... ? ......“SelectAll”,事件中的網格被稱為...... dtgridPopulate
......這令人困惑。
鑒於此,我建議有兩件事可以提供幫助。 1)為第二個網格創建並使用“空” DataTable
。 這樣我們就可以簡單地從該表中添加和刪除項目。 2) 為此使用網格CellContnetClick
事件。 如果用戶一遍又一遍地點擊同一個單元格,它將重新觸發,除了僅在復選框更改時觸發。
所以,我提出了這些小的改變。 首先將名為generateDT
的全局變量添加為用作DataSource
的DataTable
到第二個網格。 最初這個表是空的。 其次,使用網格CellContentClick
事件來添加和刪除這些行。
Dim generateDT As DataTable
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim dt As DataTable = New DataTable()
dt.Columns.Add("checkbox", GetType(Boolean))
dt.Columns.Add("code", GetType(String))
dt.Columns.Add("Name", GetType(String))
dt.Rows.Add(False, "c1", "customer 1")
dt.Rows.Add(False, "c2", "customer 2")
dt.Rows.Add(False, "c3", "customer 3")
dtgridPopulate.DataSource = dt
generateDT = New DataTable()
generateDT.Columns.Add("code", GetType(String))
generateDT.Columns.Add("Name", GetType(String))
dtgridGenerate.DataSource = generateDT
End Sub
然后在單元格內容點擊事件中,如果點擊的單元格是復選框單元格,那么……獲取選中狀態以及點擊行的code
和name
。 然后,如果選中復選框單元格,則只需將code
和name
添加到第二個網格全局DataTable
變量generateDT
。 如果未選中該復選框,那么我們將遍歷第二個網格中的每一行,如果我們找到匹配項,則只需從第二個網格全局DataTable
中刪除該行……類似於……
Private Sub dtgridPopulate_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dtgridPopulate.CellContentClick
If e.ColumnIndex = 0 Then
Dim Checked = CType(dtgridPopulate.Rows(e.RowIndex).Cells(e.ColumnIndex).EditedFormattedValue, Boolean)
Dim code = dtgridPopulate.CurrentRow.Cells(1).Value.ToString
Dim Name = dtgridPopulate.CurrentRow.Cells(2).Value.ToString
If Checked Then
generateDT.Rows.Add(code, Name)
Else
Dim rowToRemove As DataRowView
For Each row As DataGridViewRow In dtgridGenerate.Rows
If row.Cells(0).Value.ToString() = code Then
rowToRemove = CType(row.DataBoundItem, DataRowView)
generateDT.Rows.Remove(rowToRemove.Row)
Exit For
End If
Next
End If
End If
End Sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.