|
■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
|