/// <summary>
/// https://www.codeproject.com/articles/3225/treelistview
/// https://www.codeproject.com/Tips/572728/TreeListViewEx-Tree-List-and-Drag-and-Drop
/// https://sourceforge.net/projects/objectlistview/
/// 涂聚文 20190704
/// Geovin Du
/// </summary>
public partial class TryTreeListView : Form
{
List<int> selectindex = new List<int>();// TreeListViewItem draggedNode=new TreeListViewItem();
/// <summary>
///
/// </summary>
public string draggtext
{
set;
get;
}
/// <summary>
///
/// </summary>
string beforeEdit = "";
/// <summary>
///
/// </summary>
string beforeEditName = "";
/// <summary>
///
/// </summary>
string afterEdit = "";
string nodechildid = "";
string nodeparentid = "";
string nodechild = "";
string nodeparent = "";
string nodetitle = "";
/// <summary>
///
/// </summary>
List<TreeListViewItem> getList = new List<TreeListViewItem>();
/// <summary>
///
/// </summary>
/// <returns></returns>
DataTable setList()
{ DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("ParentId", typeof(int));
dt.Columns.Add("Level", typeof(int));
dt.Rows.Add(1, "六福集团", 0,0);
dt.Rows.Add(2, "广州六福", 1,1);
dt.Rows.Add(3, "北京六福", 1,1);
dt.Rows.Add(4, "上海六福", 1,1);
dt.Rows.Add(5, "深圳六福", 1,1);
dt.Rows.Add(6, "人事部", 5,2);
dt.Rows.Add(7, "科技部", 5,2);
dt.Rows.Add(8, "恒大集团", 0, 0);
dt.Rows.Add(9, "恒大广州", 8, 1);
dt.Rows.Add(10, "恒大北京", 8, 1);
dt.Rows.Add(11, "恒大上海", 8, 1);
dt.Rows.Add(12, "恒大深圳", 8, 1);
dt.Rows.Add(13, "人事部", 11, 2);
dt.Rows.Add(14, "科技部", 11, 2); return dt;
}
/// <summary>
///
/// </summary>
/// <param name="tr1"></param>
/// <param name="parentId"></param>
private void setTreeView(TreeView tr1, int parentId)
{ DataRow[] ds = setList().Select("ParentId=" + parentId.ToString());
if (ds.Length > 0)
{
int pId = -1;
foreach (DataRow row in ds)
{
TreeNode node = new TreeNode();
node.Text = row["Name"].ToString();
node.Tag = (int)row["Id"];
pId = (int)row["ParentId"];
if (pId == 0)
{
//添加根节点
tr1.Nodes.Add(node);
}
else
{
//添加根节点之外的其他节点
RefreshChildNode(tr1, node, pId);
}
//查找以node为父节点的子节点
setTreeView(tr1, (int)node.Tag); }
} }
/// <summary>
///
/// </summary>
public void bind()
{ ColumnHeader head=new ColumnHeader();
head.Text = "Level";
treeListView1.Columns.Add(head);
DataRow[] ds = setList().Select("ParentId=0"); foreach (DataRow row in ds)
{ //第一层
TreeListViewItem itemA = new TreeListViewItem(row["Name"].ToString(), 0);
itemA.Expand();
itemA.SubItems.Add(row["Id"].ToString());
itemA.SubItems.Add(row["ParentId"].ToString());
itemA.SubItems.Add(row["Level"].ToString());
itemA.ToolTipText = row["ParentId"].ToString();
treeListView1.Items.Add(itemA);
DataRow[] ds1 = setList().Select("ParentId=" + row["Id"].ToString());
if (ds1.Length > 0)
{
//第二层
foreach (DataRow row1 in ds1)
{
if (row["Id"].ToString() == row1["ParentId"].ToString())
{
TreeListViewItem item = new TreeListViewItem(row1["Name"].ToString(), 1);
item.SubItems.Add(row1["Id"].ToString());
item.SubItems.Add(row1["ParentId"].ToString());
item.SubItems.Add(row1["Level"].ToString());
item.ToolTipText = row1["ParentId"].ToString();
itemA.Items.Add(item); DataRow[] ds2 = setList().Select("ParentId=" + row1["Id"].ToString());
if (ds2.Length > 0)
{
foreach (DataRow row2 in ds2)
{
//第三层
if (row1["Id"].ToString() == row2["ParentId"].ToString())
{
TreeListViewItem item2 = new TreeListViewItem(row2["Name"].ToString(), 2);
item2.SubItems.Add(row2["Id"].ToString());
item2.SubItems.Add(row2["ParentId"].ToString());
item2.SubItems.Add(row2["Level"].ToString());
item2.ToolTipText = row2["ParentId"].ToString();
item.Items.Add(item2);
} }
}
}
}
} } }
/// <summary>
/// 处理根节点的子节点
/// </summary>
/// <param name="tr1"></param>
/// <param name="treeNode"></param>
/// <param name="parentId"></param>
private void RefreshChildNode(TreeView tr1, TreeNode treeNode, int parentId)
{
foreach (TreeNode node in tr1.Nodes)
{
if ((int)node.Tag == parentId)
{
node.Nodes.Add(treeNode);
return;
}
else if (node.Nodes.Count > 0)
{
FindChildNode(node, treeNode, parentId);
}
}
}
/// <summary>
/// 处理根节点的子节点的子节点
/// </summary>
/// <param name="tNode"></param>
/// <param name="treeNode"></param>
/// <param name="parentId"></param>
private void FindChildNode(TreeNode tNode, TreeNode treeNode, int parentId)
{ foreach (TreeNode node in tNode.Nodes)
{
if ((int)node.Tag == parentId)
{
node.Nodes.Add(treeNode);
return;
}
else if (node.Nodes.Count > 0)
{
FindChildNode(node, treeNode, parentId); } } } /// <summary>
///
/// </summary>
public TryTreeListView()
{
InitializeComponent();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TryTreeListView_Load(object sender, EventArgs e)
{
setTreeView(this.treeView1, 0);
this.treeView1.ExpandAll();
bind();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_ItemCheck(object sender, ItemCheckEventArgs e)
{ TreeListViewItem item = new TreeListViewItem();
//MessageBox.Show(e.Index.ToString());
// TreeListViewItem
//MessageBox.Show(treeListView1.SelectedItems.Count.ToString());
// MessageBox.Show(treeListView1.Items[0].SubItems[0].Text);
//MessageBox.Show(treeListView1.GetTreeListViewItemFromIndex(e.Index).Text);
if (treeListView1.GetTreeListViewItemFromIndex(e.Index).Checked == false)
{ //MessageBox.Show(treeListView1.GetTreeListViewItemFromIndex(e.Index).SubItems[0].Text); //从子节点开始
item = treeListView1.GetTreeListViewItemFromIndex(e.Index);
getList.Add(item);
} //取消
//if (treeListView1.GetTreeListViewItemFromIndex(e.Index).Checked == true)
//{
// MessageBox.Show(treeListView1.GetTreeListViewItemFromIndex(e.Index).SubItems[0].Text);
//} //MessageBox.Show(e.Index.ToString());
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_ItemActivate(object sender, EventArgs e)
{ }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
this.textBox1.Text=getList.Count.ToString();
string s = getList[0].FullPath; //节点路径
string l=getList[0].Level.ToString();
string ss = getList[0].Parent.Text;
string sb = getList[0].Parent.SubItems[0].Text;
Form1 frm = new Form1();
frm.fullpath = getList[0].FullPath; //节点路径
frm.editname = getList[0].Text;
frm.id = getList[0].SubItems[1].Text;
if (frm.ShowDialog() == DialogResult.OK)
{ }
getList = new List<TreeListViewItem>(); }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_ItemMouseHover(object sender, ListViewItemMouseHoverEventArgs e)
{
//MessageBox.Show(e.Item.Text);
}
/// <summary>
/// 编辑前的值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_BeforeLabelEdit(object sender, TreeListViewBeforeLabelEditEventArgs e)
{
MessageBox.Show(e.Item.Text);
} /// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_AfterLabelEdit(object sender, TreeListViewLabelEditEventArgs e)
{
MessageBox.Show(e.Item.Text);
}
/// <summary>
/// 拖放完成发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_DragDrop(object sender, DragEventArgs e)
{
try
{ // Retrieve the client coordinates of the drop location.
Point targetPoint = treeListView1.PointToClient(new Point(e.X, e.Y));
//所要放置的位置
// Retrieve the node at the drop location.
TreeListViewItem targetNode = treeListView1.GetItemAt(targetPoint);
TreeListViewItem fullNode = treeListView1.GetItemAtFullRow(targetPoint);
// draggedNode = (TreeListViewItem)e.Data.GetData(typeof(TreeListViewItem));
//string s = e.Data.GetData(typeof(TreeListViewItem)).ToString();
System.Windows.Forms.TreeListView.DragItemData data = (System.Windows.Forms.TreeListView.DragItemData)e.Data.GetData(typeof(System.Windows.Forms.TreeListView.DragItemData));
draggedNode = (TreeListViewItem)data.DragItems[0]; if (!draggedNode.Equals(targetNode) && !ContainsNode(draggedNode, targetNode))
{
// If it is a move operation, remove the node from its current
// location and add it to the node at the drop location.
if (e.Effect == DragDropEffects.Move)
{ //draggedNode.Remove();
// int indx=targetNode.Index;
// targetNode.Items.Insert(draggedNode.Index,draggedNode);
//treeListView1.Items.Insert(indx, targetNode); draggedNode.Remove();
targetNode.Items.Add(draggedNode); // targetNode.Items.Insert(indx, draggedNode); //父节点,添加移动的子节点 nodechildid = draggedNode.SubItems[1].Text;//子节点
nodeparentid = targetNode.SubItems[1].Text;//父节点
nodechild = draggedNode.Text;//子节点
nodeparent = targetNode.Text;//父节点
nodetitle = draggedNode.ToolTipText; //bookKindListInfo.BookKindID = int.Parse(nodechildid);
//bookKindListInfo.BookKindParent = int.Parse(nodeparentid);
//bookKindListInfo.BookKindName = nodechild;
//bookKindListInfo.BookKindCode = nodetitle;
//this.textBox1.Text = nodeparent;
//this.textBox2.Text = nodechild;
//this.textBox3.Text = nodetitle;
//formOperatingStringInfo.NodeMoveUpdated = true; //button1.Text = "移動區域節點"; //administrativeAreaListInfo.AreaID = int.Parse(nodechildid);
//administrativeAreaListInfo.AreaParentID = int.Parse(nodeparentid);
//administrativeAreaListInfo.AreaName = nodechild;
//int k = bookKindListBLL.UpdateBookKindList(bookKindListInfo);
//if (k >= 1)
//{
// MessageBox.Show("移動书目录成功!");
// InitDataTable();
// BindRoot();
// treeView1.ExpandAll(); //全部展开
//}
//else
//{
// MessageBox.Show("移動书目录不成功!");
//} /// MessageBox.Show("子节点:" + nodechild + ",父节点:" + nodeparent, "拖动节点", MessageBoxButtons.OK, MessageBoxIcon.Information);
} // If it is a copy operation, clone the dragged node
// and add it to the node at the drop location.
else if (e.Effect == DragDropEffects.Copy)
{
targetNode.Items.Add((TreeListViewItem)draggedNode.Clone());
} // Expand the node at the location
// to show the dropped node.
targetNode.Expand();
}
}
catch (Exception ex)
{
ex.Message.ToString();
}
} /// <summary>
///Determine whether one node is a parent
///or ancestor of a second node.
/// </summary>
/// <param name="node1"></param>
/// <param name="node2"></param>
/// <returns></returns>
private bool ContainsNode(TreeListViewItem node1, TreeListViewItem node2)
{
// Check the parent node of the second node.
if (node2.Parent == null) return false;
if (node2.Parent.Equals(node1)) return true; // If the parent node is not null or equal to the first node,
// call the ContainsNode method recursively using the parent of
// the second node.
return ContainsNode(node1, node2.Parent);
} /// <summary>
/// 施放离开边界时发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_DragLeave(object sender, EventArgs e)
{ }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.AllowedEffect; }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_ItemDrag(object sender, ItemDragEventArgs e)
{
// Move the dragged node when the left mouse button is used.
if (e.Button == MouseButtons.Left)
{
DoDragDrop(e.Item, DragDropEffects.Move);
draggedNode = (TreeListViewItem)e.Item; } // Copy the dragged node when the right mouse button is used.
else if (e.Button == MouseButtons.Right)
{
DoDragDrop(e.Item, DragDropEffects.Copy);
draggedNode = (TreeListViewItem)e.Item;
}
} /// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_DragOver(object sender, DragEventArgs e)
{
//draggedNode = (TreeListViewItem)e.Data.GetData(typeof(TreeListViewItem)); //Point draggedPoint = treeListView1.PointToClient(new Point(e.X, e.Y));
//draggedNode = treeListView1.GetItemAt(draggedPoint); }
/// <summary>
/// 双控件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_DoubleClick(object sender, EventArgs e)
{
string selectedname=treeListView1.SelectedItems[0].Text;
Form1 frm = new Form1();
frm.fullpath = treeListView1.SelectedItems[0].FullPath; //节点路径
frm.editname = treeListView1.SelectedItems[0].Text;
frm.id = treeListView1.SelectedItems[0].SubItems[1].Text;
if (frm.ShowDialog() == DialogResult.OK)
{ }
this.textBox1.Text = selectedname;
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListView1_Leave(object sender, EventArgs e)
{
if (treeListView1.SelectedItems!= null)
{
//让选中项背景色呈现红色
treeListView1.SelectedItems[0].BackColor = Color.Red;
//前景色为白色
treeListView1.SelectedItems[0].ForeColor = Color.White;
}
}
/// <summary>
/// 添加子节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void addToolStripMenuItem_Click(object sender, EventArgs e)
{ }
/// <summary>
/// 编辑当前节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void editToolStripMenuItem_Click(object sender, EventArgs e)
{ }
/// <summary>
/// 删除当前节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void delToolStripMenuItem_Click(object sender, EventArgs e)
{ }
/// <summary>
/// 添加同层节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void addLevelToolStripMenuItem_Click(object sender, EventArgs e)
{ } }

  

Csharp: TreeList Drag and Drop的更多相关文章

  1. HTML5 之拖放(drag与drop)

    拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. HTML5 拖放实例 ...

  2. 通过HTML5的Drag and Drop生成拓扑图片Base64信息

    HTML5 原生的 Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过 ...

  3. 基于HTML5的Drag and Drop生成图片Base64信息

    HTML5的Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过Drag ...

  4. Android 用户界面---拖放(Drag and Drop)(三)

      设计拖放操作 本节主要内容如下: 1.  如何开始拖拽: 2.  在拖拽期间如何响应事件: 3.  如何响应落下事件: 4.  如何结束拖放操作. 开始拖拽 用户使用一个拖拽手势开始拖拽,通常是在 ...

  5. Android 用户界面---拖放(Drag and Drop)(二)

      拖拽事件监听器和回调方法 View对象既可以用实现View.OnDragListener接口的拖放事件监听器,也可以用View对象的onDragEvent(DragEvent)回调方法来接收拖拽事 ...

  6. Android 用户界面---拖放(Drag and Drop)(一)

    用Android的拖放框架,能够允许用户使用图形化的拖放手势,把数据从当前布局中的一个View对象中移到另一个View对象中.这个框架包括:拖拽事件类.拖拽监听器.以及辅助的方法和类. 尽管这个框架主 ...

  7. 20 Best Drag and Drop jQuery Plugins--reference

    reference from:http://dizyne.net/20-best-drag-drop-jquery-plugins/ jQuery has done a great job repla ...

  8. [Javascript + rxjs] Simple drag and drop with Observables

    Armed with the map and concatAll functions, we can create fairly complex interactions in a simple wa ...

  9. HTML 5 drag and drop 简介

    Html 5 drag and drop 简介 HTML5提供了专门拖拽和拖放的API draggable属性 启用拖拽 draggable属性是否可被拖拽, 可选值: true, false, au ...

随机推荐

  1. Java基础常见笔试题总结

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件 2.“sta ...

  2. 1、Docker 简介

    目录 Docker 起源 Docker 架构 特性 局限 名称空间隔离 原理 Control Groups (cgroups) Docker Docker 啥是docker? Docker 是一个开源 ...

  3. MySQL主从介绍、配置主从、测试主从同步

    6月28日任务 说明:有不少同学不能一次性把实验做成功,这是因为还不熟悉,建议至少做3遍17.1 MySQL主从介绍17.2 准备工作17.3 配置主17.4 配置从17.5 测试主从同步有的同学,遇 ...

  4. Java 从入门到进阶之路(十一)

    之前的文章我们介绍了一下 Java 中的继承,接下来我们继续看一下 Java 中的继承. 在有些时候,我们通过类继承的方式可以获取父类的方法,但是有些时候父类为我们提供的方法并不完全符合我们的需求,这 ...

  5. css实现对勾

    <!DOCTYPE html><html> <head> <meta charset=%;background-color: #2ac845;} %;back ...

  6. 转:Java transient关键字使用小记

    哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transi ...

  7. Spring bean 初始化失败

    在一个*context.xml 配置文件 A 中, 有个定义的bean B, 把 A 添加到 application-context.xml 中,发现B不能正常初始化. 解决办法: 添加 <co ...

  8. CF 17E Palisection 求相交回文串个数

    In an English class Nick had nothing to do at all, and remembered about wonderful strings called pal ...

  9. 2017 CCPC秦皇岛 E题 String of CCPC

    BaoBao has just found a string  of length  consisting of 'C' and 'P' in his pocket. As a big fan of ...

  10. ZOJ 3195 Design the city (LCA 模板题)

    Cerror is the mayor of city HangZhou. As you may know, the traffic system of this city is so terribl ...