我想使用 DataTable Select 进行从 DataGridView 源从 Datatable 到 Form2 到 DataGridView 源从 DataTable Form1 的突变,但 Form1 中 DataGridView 中的结果与我的代码可能存在的问题不匹配。
谢谢
datagridview 表单中的期望结果
第1栏 | 第2栏 | 第3栏 | 第4栏 | 数量 |
---|---|---|---|---|
001 | 测试1 | 测试1 | 测试1 | 1 |
001 | 测试1 | 测试1 | 1 | |
001 | 测试1 | 1 | ||
001 | 测试1 | 测试1 | 1 | |
002 | 测试2 | 测试2 | 测试2 | 1 |
Form1 中的代码
Public Class Form1
Private table1 As New DataTable
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
table1.Columns.Add(New DataColumn("Column1", GetType(String)))
table1.Columns.Add(New DataColumn("Column2", GetType(String)))
table1.Columns.Add(New DataColumn("Column3", GetType(String)))
table1.Columns.Add(New DataColumn("Column4", GetType(String)))
table1.Columns.Add(New DataColumn("Qty", GetType(Integer)))
DataGridView1.DataSource = table1
End Sub
Private Sub BTNAdd_Click(sender As Object, e As EventArgs) Handles BTNAdd.Click
Dim Column2 As String = TextBox2.Text.Trim()
Dim Column1 = TextBox1.Text.Trim()
Using frm = New Form2(Column2)
If frm.ShowDialog() = DialogResult.OK Then
Dim datarow As DataRow = Nothing
Dim Column3 = frm.DataGridView1.CurrentRow.Cells(3).Value?.ToString()
Dim Column4 = frm.DataGridView1.CurrentRow.Cells(4).Value?.ToString()
If table1.Rows.Cast(Of DataRow).Any() Then
datarow = table1.Select($"Column1 = '{Column1}' AND Column2 = '{Column2}' AND Column3 = '{Column3}' OR Column3 IS NULL AND Column4 = '{Column4}' OR Column4 IS NULL").FirstOrDefault()
End If
If datarow IsNot Nothing Then
Dim qty = If(datarow("Qty") Is DBNull.Value, 0, datarow.Field(Of Integer)("Qty"))
datarow.SetField("Qty", qty + 1)
Return
Else
End If
Try
For Each row2 As DataGridViewRow In frm.DataGridView1.Rows
Dim isselect As Boolean = Convert.ToBoolean(row2.Cells("checkboxcolumn").Value)
If isselect Then
table1.Rows.Add(Column1, Column2, Column3, Column4, 1)
TextBox1.Clear()
TextBox2.Clear()
End If
Next
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Else
Return
End If
End Using
End Sub
End Class
Form2 中的代码
Public Class Form2
Sub New()
InitializeComponent()
End Sub
Public Function ConvertToList(Of T)(ByVal dt As DataTable) As List(Of T)
Dim columnNames = dt.Columns.Cast(Of DataColumn)().Select(Function(c) c.ColumnName).ToList()
Dim properties = GetType(T).GetProperties()
Return dt.AsEnumerable().Select(Function(row)
Dim objT = Activator.CreateInstance(Of T)()
For Each pro In properties
If columnNames.Contains(pro.Name) Then
Dim pI As PropertyInfo = objT.GetType().GetProperty(pro.Name)
pro.SetValue(objT, If(row(pro.Name) Is DBNull.Value, Nothing, Convert.ChangeType(row(pro.Name), pI.PropertyType)))
End If
Next pro
Return objT
End Function).ToList()
End Function
Public Sub New(Column2 As String)
Me.New
Dim table2 As New DataTable("Players")
table2.Columns.Add(New DataColumn("Column1", GetType(String)))
table2.Columns.Add(New DataColumn("Column2", GetType(String)))
table2.Columns.Add(New DataColumn("Column3", GetType(String)))
table2.Columns.Add(New DataColumn("Column4", GetType(String)))
table2.Rows.Add("001", "TEST1", "TEST1", "TEST1")
table2.Rows.Add("001", "TEST1", "TEST1", "")
table2.Rows.Add("001", "TEST1", "", "")
table2.Rows.Add("001", "TEST1", "", "TEST1")
table2.Rows.Add("002", "TEST2", "", "TEST2")
DataGridView1.DataSource = ConvertToList(Of Table2)(table2)
Dim CheckedBoxColumn As New DataGridViewCheckBoxColumn
CheckedBoxColumn.Width = 40
CheckedBoxColumn.Name = "checkboxcolumn"
CheckedBoxColumn.HeaderText = "Check"
DataGridView1.Columns.Insert(0, CheckedBoxColumn)
End Sub
Private Sub BtnOK_Click(sender As Object, e As EventArgs) Handles BtnOK.Click
DialogResult = DialogResult.OK
End Sub
End Class
Public Class Table2
Public Property Column1() As String
Public Property Column2() As String
Public Property Column3() As String
Public Property Column4() As String
End Class