簡體   English   中英

datagridview 值從另一個 datagridview 中刪除

[英]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的全局變量添加為用作DataSourceDataTable到第二個網格。 最初這個表是空的。 其次,使用網格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

然后在單元格內容點擊事件中,如果點擊的單元格是復選框單元格,那么……獲取選中狀態以及點擊行的codename 然后,如果選中復選框單元格,則只需將codename添加到第二個網格全局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.

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