作成日: 2023/07/14 最終更新日: 2023/07/14
文書種別
使用方法
詳細
TreeViewをDataTableにバインドしている場合に、ドラッグ&ドロップによって1つ目のTreeViewから他のTreeViewにノードをコピーするには、C1TreeViewのDragEnter、DragDrop、およびItemDragイベントを利用し、DataRowのAdd、InsertAtメソッドを用いてノードの追加、挿入を行う方法が考えられます。
以下に、左側のTreeViewから右側のTreeViewへノードをコピーするための簡単な実装例を記載します。

◎サンプルコード(VB)
以下に、左側のTreeViewから右側のTreeViewへノードをコピーするための簡単な実装例を記載します。
◎サンプルコード(VB)
Imports C1.Win.TreeView
Public Class Form1
Dim dataTable1 As DataTable = New DataTable("DataTable1")
Dim dataTable2 As DataTable = New DataTable("DataTable2")
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
C1TreeView1.AllowDrop = True
C1TreeView2.AllowDrop = True
' c1TreeView1 - DataTableの設定
dataTable1.Columns.Add("Column0", GetType(Int32))
dataTable1.Columns.Add("Column1", GetType(Int32))
dataTable1.Columns.Add("Column2", GetType(Int32))
dataTable1.Columns.Add("Data01", GetType(String))
dataTable1.Rows.Add(0, 0, -1, "NodeA1")
dataTable1.Rows.Add(1, 1, 0, "NodeA00")
dataTable1.Rows.Add(2, 2, 0, "NodeA01")
dataTable1.Rows.Add(3, 3, 0, "NodeA02")
dataTable1.Rows.Add(4, 4, 0, "NodeA03")
dataTable1.Rows.Add(5, 5, 0, "NodeA04")
dataTable1.AcceptChanges()
' c1TreeView1 - BindingInfoの設定
Dim info As BindingInfo = C1TreeView1.BindingInfo
info.KeyField = dataTable1.Columns(1).ColumnName
info.ParentKeyField = dataTable1.Columns(2).ColumnName
info.BindingMode = BindingMode.TwoWay
info.DataMember = dataTable1.Columns(3).ColumnName
info.DataSource = dataTable1
C1TreeView1.Columns(0).DisplayFieldName = dataTable1.Columns(3).ColumnName
C1TreeView1.AllowEditing = True
C1TreeView1.EditMode = C1TreeViewEditMode.EditOnEnter
C1TreeView1.ExpandAll()
' c1TreeView2 - DataTableの設定
dataTable2.Columns.Add("Column20", GetType(Int32))
dataTable2.Columns.Add("Column21", GetType(Int32))
dataTable2.Columns.Add("Column22", GetType(Int32))
dataTable2.Columns.Add("Data02", GetType(String))
dataTable2.Rows.Add(0, 0, -1, "NodeB1")
dataTable2.Rows.Add(1, 1, 0, "NodeB00")
dataTable2.Rows.Add(2, 2, 0, "NodeB01")
dataTable2.Rows.Add(3, 3, 0, "NodeB02")
dataTable2.Rows.Add(4, 4, 0, "NodeB03")
dataTable2.Rows.Add(5, 5, 0, "NodeB04")
dataTable2.AcceptChanges()
' c1TreeView2 - BindingInfoの設定
Dim info2 As BindingInfo = C1TreeView2.BindingInfo
info2.KeyField = dataTable2.Columns(1).ColumnName
info2.ParentKeyField = dataTable2.Columns(2).ColumnName
info2.BindingMode = BindingMode.TwoWay
info2.DataMember = dataTable2.Columns(3).ColumnName
info2.DataSource = dataTable2
C1TreeView2.Columns(0).DisplayFieldName = dataTable2.Columns(3).ColumnName
C1TreeView2.AllowEditing = True
C1TreeView2.EditMode = C1TreeViewEditMode.EditOnEnter
C1TreeView2.ExpandAll()
AddHandler C1TreeView1.ItemDrag, AddressOf C1TreeView_ItemDrag
AddHandler C1TreeView2.ItemDrag, AddressOf C1TreeView_ItemDrag
AddHandler C1TreeView1.DragEnter, AddressOf C1TreeView_DragEnter
AddHandler C1TreeView2.DragEnter, AddressOf C1TreeView_DragEnter
AddHandler C1TreeView1.DragDrop, AddressOf C1TreeView_DragDrop
AddHandler C1TreeView2.DragDrop, AddressOf C1TreeView_DragDrop
End Sub
Private Sub C1TreeView_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)
Dim treeView = CType(sender, C1TreeView)
If (TryCast((treeView.BindingInfo.DataSource), DataTable)).TableName = "DataTable2" Then
treeView.BeginUpdate()
Dim distanceNodes = CType(e.Data.GetData(GetType(C1TreeNode())), C1TreeNode())
Dim distanceNode = distanceNodes(0)
Dim dropPoint = treeView.PointToClient(New Point(e.X, e.Y))
Dim pos = CType(e.Data.GetData(GetType(DragDropPosition)), DragDropPosition)
Dim rowsCount = dataTable2.Rows.Count
Dim item = (TryCast(distanceNode.GetValue(), DataRow)).ItemArray(3)
Dim currentNode = treeView.GetNodeAtPoint(dropPoint)
If currentNode IsNot Nothing Then
Dim index = CInt((TryCast(currentNode.GetValue(), DataRow)).ItemArray(1))
Dim desRow = dataTable2.NewRow()
Select Case pos
Case DragDropPosition.After
For i As Integer = index + 1 To dataTable2.Rows.Count - 1
dataTable2.Rows(i).SetField(Of Integer)(0, i + 1)
dataTable2.Rows(i).SetField(Of Integer)(1, i + 1)
Next
desRow.ItemArray = {index + 1, index + 1, (TryCast(currentNode.GetValue(), DataRow)).ItemArray(2), item}
dataTable2.Rows.InsertAt(desRow, index + 1)
Case DragDropPosition.Before
For i As Integer = index To dataTable2.Rows.Count - 1
dataTable2.Rows(i).SetField(Of Integer)(0, i + 1)
dataTable2.Rows(i).SetField(Of Integer)(1, i + 1)
Next
desRow.ItemArray = {index, index, (TryCast(currentNode.GetValue(), DataRow)).ItemArray(2), item}
dataTable2.Rows.InsertAt(desRow, index)
Case DragDropPosition.Inner
dataTable2.Rows.Add(rowsCount, rowsCount, (TryCast(currentNode.GetValue(), DataRow)).ItemArray(1), item)
End Select
Else
dataTable2.Rows.Add(rowsCount, rowsCount, -1, item)
End If
dataTable2.AcceptChanges()
treeView.EndUpdate()
treeView.ExpandAll()
End If
End Sub
Private Sub C1TreeView_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs)
e.Effect = DragDropEffects.Move
End Sub
Private Sub C1TreeView_ItemDrag(ByVal sender As Object, ByVal e As C1.Win.TreeView.C1TreeViewItemDragEventArgs)
DoDragDrop(e.DraggedData, DragDropEffects.Move)
End Sub
End Class
◎サンプルコード(C#)
using C1.Win.TreeView;
namespace prj_TreeView
{
public partial class Form1 : Form
{
DataTable dataTable1 = new DataTable("DataTable1");
DataTable dataTable2 = new DataTable("DataTable2");
public Form1()
{
InitializeComponent();
c1TreeView1.AllowDrop = true;
c1TreeView2.AllowDrop = true;
c1TreeView1.ItemDrag += C1TreeView_ItemDrag;
c1TreeView2.ItemDrag += C1TreeView_ItemDrag;
c1TreeView1.DragEnter += C1TreeView_DragEnter;
c1TreeView2.DragEnter += C1TreeView_DragEnter;
c1TreeView1.DragDrop += C1TreeView_DragDrop;
c1TreeView2.DragDrop += C1TreeView_DragDrop;
}
private void Form1_Load_1(object sender, EventArgs e)
{
// c1TreeView1 - DataTableの設定
dataTable1.Columns.Add("Column0", typeof(Int32));
dataTable1.Columns.Add("Column1", typeof(Int32));
dataTable1.Columns.Add("Column2", typeof(Int32));
dataTable1.Columns.Add("Data01", typeof(String));
dataTable1.Rows.Add(0, 0, -1, "NodeA1");
dataTable1.Rows.Add(1, 1, 0, "NodeA00");
dataTable1.Rows.Add(2, 2, 0, "NodeA01");
dataTable1.Rows.Add(3, 3, 0, "NodeA02");
dataTable1.Rows.Add(4, 4, 0, "NodeA03");
dataTable1.Rows.Add(5, 5, 0, "NodeA04");
dataTable1.AcceptChanges();
// c1TreeView1 - BindingInfoの設定
BindingInfo info = c1TreeView1.BindingInfo;
info.KeyField = dataTable1.Columns[1].ColumnName;
info.ParentKeyField = dataTable1.Columns[2].ColumnName;
info.BindingMode = BindingMode.TwoWay;
info.DataMember = dataTable1.Columns[3].ColumnName;
info.DataSource = dataTable1;
c1TreeView1.Columns[0].DisplayFieldName = dataTable1.Columns[3].ColumnName;
c1TreeView1.AllowEditing = true;
c1TreeView1.EditMode = C1TreeViewEditMode.EditOnEnter;
c1TreeView1.ExpandAll();
// c1TreeView2 - DataTableの設定
dataTable2.Columns.Add("Column20", typeof(Int32));
dataTable2.Columns.Add("Column21", typeof(Int32));
dataTable2.Columns.Add("Column22", typeof(Int32));
dataTable2.Columns.Add("Data02", typeof(String));
dataTable2.Rows.Add(0, 0, -1, "NodeB1");
dataTable2.Rows.Add(1, 1, 0, "NodeB00");
dataTable2.Rows.Add(2, 2, 0, "NodeB01");
dataTable2.Rows.Add(3, 3, 0, "NodeB02");
dataTable2.Rows.Add(4, 4, 0, "NodeB03");
dataTable2.Rows.Add(5, 5, 0, "NodeB04");
dataTable2.AcceptChanges();
// c1TreeView2 - BindingInfoの設定
BindingInfo info2 = c1TreeView2.BindingInfo;
info2.KeyField = dataTable2.Columns[1].ColumnName;
info2.ParentKeyField = dataTable2.Columns[2].ColumnName;
info2.BindingMode = BindingMode.TwoWay;
info2.DataMember = dataTable2.Columns[3].ColumnName;
info2.DataSource = dataTable2;
c1TreeView2.Columns[0].DisplayFieldName = dataTable2.Columns[3].ColumnName;
c1TreeView2.AllowEditing = true;
c1TreeView2.EditMode = C1TreeViewEditMode.EditOnEnter;
c1TreeView2.ExpandAll();
}
private void C1TreeView_DragDrop(object sender, DragEventArgs e)
{
var treeView = (C1TreeView)sender;
if (((treeView.BindingInfo.DataSource) as DataTable).TableName == "DataTable2")
{
treeView.BeginUpdate();
var distanceNodes = (C1TreeNode[])e.Data.GetData(typeof(C1TreeNode[]));
var distanceNode = distanceNodes[0];
var dropPoint = treeView.PointToClient(new Point(e.X, e.Y));
var pos = (DragDropPosition)e.Data.GetData(typeof(DragDropPosition));
var rowsCount = dataTable2.Rows.Count;
var item = (distanceNode.GetValue() as DataRow).ItemArray[3];
var currentNode = treeView.GetNodeAtPoint(dropPoint);
if (currentNode != null)
{
var index = (int)(currentNode.GetValue() as DataRow).ItemArray[1];
var desRow = dataTable2.NewRow();
switch (pos)
{
case DragDropPosition.After:
for (int i = index+1; i < dataTable2.Rows.Count;i++)
{
dataTable2.Rows[i].SetField(0, i + 1);
dataTable2.Rows[i].SetField(1, i + 1);
}
desRow.ItemArray = new[] { index + 1, index + 1, (currentNode.GetValue() as DataRow).ItemArray[2], item };
dataTable2.Rows.InsertAt(desRow,index+1);
break;
case DragDropPosition.Before:
for (int i = index; i < dataTable2.Rows.Count;i++)
{
dataTable2.Rows[i].SetField(0, i+1);
dataTable2.Rows[i].SetField(1, i+1);
}
desRow.ItemArray = new[] { index, index, (currentNode.GetValue() as DataRow).ItemArray[2], item };
dataTable2.Rows.InsertAt(desRow,index);
break;
case DragDropPosition.Inner:
dataTable2.Rows.Add(rowsCount, rowsCount, (currentNode.GetValue() as DataRow).ItemArray[1], item);
break;
}
}
else
{
dataTable2.Rows.Add(rowsCount, rowsCount, -1, item);
}
dataTable2.AcceptChanges();
treeView.EndUpdate();
treeView.ExpandAll();
}
}
private void C1TreeView_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
private void C1TreeView_ItemDrag(object sender, C1.Win.TreeView.C1TreeViewItemDragEventArgs e)
{
DoDragDrop(e.DraggedData, DragDropEffects.Move);
}
}
}