次のコードは、DataGridViewのDataSourceとなるDataTableにデータを読み込みます。 Button1は、DataGridview CheckBoxがチェックされている各行を取得する方法を示しています。ここでは、列名が存在するかどうかを検証するためのアサーションは省略しています。最後に、このために必要ではないが、知っておくと良いことがいくつかあります。
ヘルパー
Module BindingSourceExtensions
<System.Runtime.CompilerServices.Extension()> _
Public Function CurrentRow(ByVal sender As BindingSource, ByVal Column As String) As String
Return DirectCast(sender.Current, DataRowView).Row(Column).ToString
End Function
End Module
DataGridViewの拡張
Module DataGridviewExtensions
<System.Diagnostics.DebuggerStepThrough()> _
<Runtime.CompilerServices.Extension()> _
Public Function ExportSelectedRows(ByVal sender As DataGridView, ByVal ColumnName As String) As String()
Return _
(
From row In sender.Rows.Cast(Of DataGridViewRow)()
Where Not row.IsNewRow AndAlso CType(row.Cells(ColumnName).Value, Boolean) = True
Let RowItem = String.Join(",", Array.ConvertAll(
row.Cells.Cast(Of DataGridViewCell).ToArray,
Function(c As DataGridViewCell) If(c.Value Is Nothing, "", c.Value.ToString)))
Select RowItem).ToArray
End Function
End Module
フォームコード
は、私はすべてこれにより
Public Class Form1
Private checkBoxColumnName As String = "AvailableColumn"
Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DataGridView1.AutoGenerateColumns = False
DataGridView1.DataSource = GetMockedData()
End Sub
Private Function GetMockedData() As DataTable
Dim dt As New DataTable()
dt.Columns.Add("Identifier", GetType(Integer))
dt.Columns.Add("Room", GetType(String))
dt.Columns.Add("RoomType", GetType(String))
dt.Columns.Add("Rate", GetType(Decimal))
dt.Columns.Add(checkBoxColumnName, GetType(Boolean))
dt.Columns.Add("Status", GetType(String))
dt.Rows.Add(10, "201A", "Suite", 98.99, False, "Incomplete")
dt.Rows.Add(20, "101A", "Suite", 120.99, False, "Incomplete")
dt.Rows.Add(30, "201B", "Suite", 99.99, False, "Incomplete")
dt.AcceptChanges()
Return dt
End Function
Private Sub DataGridView1SelectAll_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
If TypeOf DataGridView1.CurrentCell Is DataGridViewCheckBoxCell Then
If DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex).Name = checkBoxColumnName Then
DataGridView1.EndEdit()
Dim Checked As Boolean = CType(DataGridView1.CurrentCell.Value, Boolean)
If Checked Then
DataGridView1.CurrentRow.Cells("StatusColumn").Value = "Complete"
Else
DataGridView1.CurrentRow.Cells("StatusColumn").Value = "Incomplete"
End If
End If
End If
End Sub
Private Sub cmdClose_Click(sender As Object, e As EventArgs) Handles cmdClose.Click
Close()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim rowArray As String() = DataGridView1.ExportSelectedRows(checkBoxColumnName)
If rowArray.Count > 0 Then
For Each row As String In rowArray
Console.WriteLine(row)
Next
End If
End Sub
End Class
がレイアウトされたIDEの出力ウィンドウに示します。Console.WriteLineを使用注意します私は非常にデータソースに対して作業を見てお勧めします。 DataTableを使用してfor/nextを使用して行を反復するか、lambdaまたはlinqを使用してチェック行(DataRows)を取得します。しかし、これがオプションでない場合は、上記の方法の使用を検討してください。
a)DGVがバインドされている場合は、データソース内のデータで行、セル、またはコントロールではなく操作します。b)行をチェックするときに、それが表す項目行)。 c)カートのDataSourceは、ほとんどの場合、注文行を作成するために選択された商品のみを扱います。なぜ各セルが必要なのかわからない - それらは製品データを表します(それは似ています) – Plutonix
よく注文表にはあまりにも多くの情報を挿入する必要があります。そのデータは、その行の個々のセルのすべてではなく、一部のカート・ページの特定のテキスト・ボックスに表示されます。だから、私は提出することができ、各テキストボックスは各SQLインサートに等しくなります。より良い方法かもしれないが、これは私が知っているものです。 あなたと私は先週、このグリッドを稼動させて稼働させました。だから、もしあなたが「縛られている」と言うと、私は確信していません。 'myDataTable.Load(rsMPCS) DataGridView1.DataSource = myDataTable' – Lee
' DataGridView1.DataSource = myDataTable'は、データソース(myDataTable)にバインドされていることを意味します。重要なのは、DGVセルではなくその行です。これらは単にユーザーに情報を表示する方法です。注文部分は同じパターンに従うべきです。 「コピーするデータがたくさん」あるべきではありません。データベースは復旧に関するものです。通常、注文書には、商品のPKを使用して、何が注文されているか、どのくらいの人がいつ誰であるかなどが示されます。ATM引き出しを行うとき、銀行システムはすべてのユーザ/あなたのPK IDを使って、どのようにすればよいかわからない人を示します。 – Plutonix