C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 122 を表示中)
■73024 / )  Re[3]: DataGridViewの内容DataGridViewに表示
□投稿者/ 魔界の仮面弁士 (78回)-(2014/08/12(Tue) 03:27:23)
No73016 (巻 さん) に返信
> [dgv1 の行データを dgv2 の 1 行目に表示して、もともと dgv2 に表示されていたデータを 2 行目以降にずらして表示したい]
> という事をしたいと考えております。

dgv1 をクリックすると、dgv2 の先頭にそれが表示されるということのようですが、
再度 dgv1 で同じ行をクリックした場合、dgv2 側に重複行が挿入されれば良いのでしょうか。


DataSet や DataTable をバインドしている場合、dataTable.Rows.InsertAt にて、特定位置への「行の挿入」ができます。
BindingSource をバインドしている場合、bindingSource.Insert にて挿入できます。

ただし、元データ側に行を挿入したとしても、DataGridView の 列ヘッダをクリックしていた場合や、
DataTable.Sort や BindingSource.Sort などで、ソート指定がされている場合、
DataGridView への並び順はそちらが優先されます。


DataGridView 側のソート機能をカスタマイズしたい場合には、下記が参考になるかも知れません。
http://msdn.microsoft.com/ja-jp/library/ms171608.aspx?cs-lang=vb


とりあえず、dataTable.Rows.InsertAt を使った例:

Public Class Form1
    Private tbl1 As DataTable
    Private tbl2 As DataTable

#Region "画面構成"
    Private WithEvents dgv1 As New DataGridView()
    Private WithEvents dgv2 As New DataGridView()
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'デザイン時に設定しておいてもOK
        Dim panel As New SplitContainer()
        panel.Orientation = Orientation.Horizontal
        panel.Panel1.Controls.Add(dgv1)
        panel.Panel2.Controls.Add(dgv2)
        dgv1.Dock = DockStyle.Fill
        dgv2.Dock = DockStyle.Fill
        panel.Dock = DockStyle.Fill
        Controls.Add(panel)
        dgv1.MultiSelect = False
        dgv1.ReadOnly = True
        dgv1.AllowUserToAddRows = False
        dgv1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        dgv2.SelectionMode = DataGridViewSelectionMode.CellSelect
        dgv2.EditMode = DataGridViewEditMode.EditOnEnter
        dgv2.AllowUserToAddRows = False

        'データの表示
        tbl1 = CreateSampleData()
        tbl2 = tbl1.Clone()
        tbl2.PrimaryKey = Nothing   '重複登録を許可
        dgv2.DataSource = tbl2
        dgv1.DataSource = tbl1
        dgv1.ClearSelection()

        'dgv2 側がソート可能だと話がややこしくなるので、NotSortable にしておく
        For Each c As DataGridViewColumn In dgv2.Columns
            c.SortMode = DataGridViewColumnSortMode.NotSortable
        Next
    End Sub
#End Region


#Region "テスト用データ"
    ''' <summary>テスト用データ</summary>
    Private Function CreateSampleData() As DataTable
        Dim dsSample As New DataSet("Sample")
        Dim tbl1 = dsSample.Tables.Add("Table1")
        tbl1.PrimaryKey = New DataColumn() {tbl1.Columns.Add("ID", GetType(Integer))}
        tbl1.Columns.Add("User", GetType(String))
        tbl1.Rows.Add(100, "山田")
        tbl1.Rows.Add(200, "田中")
        tbl1.Rows.Add(300, "山中")
        tbl1.Rows.Add(400, "中田")
        Return tbl1
    End Function
#End Region

    ''' <summary>dgv1 でクリックした行を、dgv2 の先頭に複写</summary>
    Private Sub dgv1_MouseClick(sender As Object, e As MouseEventArgs) Handles dgv1.MouseClick
        Dim ht = dgv1.HitTest(e.X, e.Y)
        If ht.RowIndex >= 0 Then
            '選択した行の取得
            Dim newRow = tbl2.NewRow()
            newRow.ItemArray = DirectCast(dgv1.Rows(ht.RowIndex).DataBoundItem, DataRowView).Row.ItemArray

            '★先頭行に挿入★
            tbl2.Rows.InsertAt(newRow, 0)
            newRow.AcceptChanges()

            '追加した行をカレント行にしておく
            dgv1.ClearSelection()
            dgv2.CurrentCell = dgv2(0, 0)
            dgv2.BeginEdit(True)
        End If
    End Sub
End Class

返信 編集キー/


管理者用

- Child Tree -