2016-04-04 7 views
0

ここでいくつかの上級ユーザーと作業した後、私は代わりにDataGridビューを使用して自分のSQLテーブルを表示するために使用していたリストビューを変換しました。今私はいくつかの問題に走っているグリッド上のデータを操作しようとすると、私はDataGridの経験がなく、私はそれを介して自分のやり方を感じています。Datagridviewチェックボックスはすべてを選択し、各セルをそれ自身の変数に保存しますか?

グリッドの最後の列は、チェックボックスの列です。ボックスをチェックしてその行のすべてを選択する方法を理解しようとしていますか?

私が学ぼうとしていた次のことは、選択したセルの内容を変数「セル1」「セル2」に保存する方法です。

いくつかのデータを取得する方法を学びながら、私はこれを理解しましたが、手動で各セルを選択しなければならず、チェックボックスをクリックするとそれが壊れます。

TextBox2.Text = "" 
    Dim FirstValue As Boolean = True 
    Dim cell As DataGridViewCell 
    For Each cell In DataGridView1.SelectedCells 
     If Not FirstValue Then 
      TextBox2.Text += ", " 
     End If 
     TextBox2.Text += cell.Value.ToString() 
     FirstValue = False 
    Next 

ここで、より良い精神的な画像を作成するためのちょっとした情報です。データグリッドには、ワークステーションで手袋を言うなど、ユーザーが必要なものを検索することに基づいて、ストックルーム内のすべての製品の表が表示されます。彼らは彼らが必要とする手袋を表す行のボックスをチェックしてほしい。その行には、量、場所、説明などの手袋の販売が含まれています。私は各セルを変数に保存して、カートに "追加"してから、後で引っ張り出すために在庫表のsqlテーブルに挿入するものを提出することができます。

+0

a)DGVがバインドされている場合は、データソース内のデータで行、セル、またはコントロールではなく操作します。b)行をチェックするときに、それが表す項目行)。 c)カートのDataSourceは、ほとんどの場合、注文行を作成するために選択された商品のみを扱います。なぜ各セルが必要なのかわからない - それらは製品データを表します(それは似ています) – Plutonix

+0

よく注文表にはあまりにも多くの情報を挿入する必要があります。そのデータは、その行の個々のセルのすべてではなく、一部のカート・ページの特定のテキスト・ボックスに表示されます。だから、私は提出することができ、各テキストボックスは各SQLインサートに等しくなります。より良い方法かもしれないが、これは私が知っているものです。 あなたと私は先週、このグリッドを稼動させて稼働させました。だから、もしあなたが「縛られている」と言うと、私は確信していません。 'myDataTable.Load(rsMPCS) DataGridView1.DataSource = myDataTable' – Lee

+0

' DataGridView1.DataSource = myDataTable'は、データソース(myDataTable)にバインドされていることを意味します。重要なのは、DGVセルではなくその行です。これらは単にユーザーに情報を表示する方法です。注文部分は同じパターンに従うべきです。 「コピーするデータがたくさん」あるべきではありません。データベースは復旧に関するものです。通常、注文書には、商品のPKを使用して、何が注文されているか、どのくらいの人がいつ誰であるかなどが示されます。ATM引き出しを行うとき、銀行システムはすべてのユーザ/あなたのPK IDを使って、どのようにすればよいかわからない人を示します。 – Plutonix

答えて

0

次のコードは、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)を取得します。しかし、これがオプションでない場合は、上記の方法の使用を検討してください。

関連する問題