前几天公司做了一个项目,在我做的子模块中,有节点上下移动的功能,要求如下:
1.上移:与同级上一节点调换位子,即与上一节点调换顺序号
2.下移:与同级下一节点调换位子,即与下一节点调换顺序号
这个问题想了很久,终于做出来了,虽然效率不是多么的好,但还是实现了功能,所以把它记在上面,以后要使用的时候,可以直接可以用,首先新建几个按钮,添加按钮事件,并在按钮事件上添加代码如下:
/**
*页面刷新
*/
private void LoadData()
{
//清空数据连接
this.treeList.DataSource = null;
//重新加载数据库
this.物料分类TableAdapter1.Fill(this.dataSet_Data1.物料分类);
this.treeList.DataSource = this.物料分类BindingSource1;
}
/**
*
* 实现上移的方法
*
*/
private void barButtonItem上移_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
//如果当前没有节点,直接终止
if (this.treeList.FocusedNode==null) {
//提示用户
MessageBox.Show("没有选择要移动的节点,请选择!", "提示");
//程序终止
return;
}
//获取当前鼠标所在的节点
TreeListNode curnode = this.treeList.FocusedNode;
//获得当前鼠标所在节点的上一个节点
TreeListNode prenode = curnode.PrevNode;
//如果上一个节点为空的话,直接终止
if (prenode == null) {
//提示用户
MessageBox.Show("在同级中已经是最顶节点,不能移动","提示");
//程序终止
return;
}
//获取当前鼠标所在节点的所有信息记录
DataRowView currow = this.treeList.GetDataRecordByNode(this.treeList.FocusedNode) as DataRowView;
//获取当前鼠标所在节点上一个节点的所有信息记录
DataRowView prerow = this.treeList.GetDataRecordByNode(this.treeList.FocusedNode.PrevNode) as DataRowView;
try
{
//交换两个节点的顺序号
prerow.BeginEdit();
currow.BeginEdit();
object obj = prerow["顺序号"];
prerow["顺序号"] = currow["顺序号"];
currow["顺序号"] = obj;
prerow.EndEdit();
currow.EndEdit();
}
catch (NullReferenceException ex)
{
//扑捉空指针异常
MessageBox.Show("错误信息"+ex);
}
//如果该节点存在父节点
if (curnode.ParentNode != null)
{
//在父节点的指定子节点中添加一个节点
curnode.ParentNode.SetValue(curnode.Id + 1, prenode);
}
else {
//在树形结构中的指定位置添加一个节点
this.treeList.AppendNode(curnode.Id + 1, prenode);
}
//数据库接受改变
this.dataSet_Data1.物料分类.AcceptChanges();
//调用exchang方法,实现数据库中顺序号的改变
Exchange(currow["编号"].ToString(), prerow["编号"].ToString());
//调用页面刷新方法
LoadData();
//展开所以的树节点
this.treeList.ExpandAll();
//把焦点置在当前节点的上一个节点上
this.treeList.SetFocusedNode(curnode);
}
/**
* 实现下移的方法
*
*/
private void barButtonItem下移_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
//如果当前节点没有节点,直接终止
if (this.treeList.FocusedNode == null) {
//提示用户
MessageBox.Show("没有选择要移动的节点,请选择!","提示");
//程序终止
return;
}
//获取当前鼠标所在的节点
TreeListNode curnode = this.treeList.FocusedNode;
//获取当前鼠标所在节点的上一个节点
TreeListNode nextnode = curnode.NextNode;
//如果所获取的下一个节点为空,直接终止
if (nextnode == null) {
//提示用户
MessageBox.Show("在同级中已经是最后节点,不能移动","提示");
//程序终止
return;
}
//获取当前鼠标所在节点的所有信息记录
DataRowView currow = this.treeList.GetDataRecordByNode(this.treeList.FocusedNode) as DataRowView;
//获取当前鼠标所在节点下一个节点的所有信息记录
DataRowView nextrow = this.treeList.GetDataRecordByNode(this.treeList.FocusedNode.NextNode) as DataRowView;
try
{
//交换两个节点的顺序号
nextrow.BeginEdit();
currow.BeginEdit();
object obj = nextrow["顺序号"];
nextrow["顺序号"] = currow["顺序号"];
currow["顺序号"] = obj;
nextrow.EndEdit();
currow.EndEdit();
}
catch (NullReferenceException ex)
{
//扑捉空指针异常
MessageBox.Show("错误信息" + ex);
}
//如果存在父节点
if (curnode.ParentNode != null)
{
//在父节点的指定子节点上添加一个节点
curnode.ParentNode.SetValue(curnode.Id, nextnode);
}
else {
//不存在父节点,在树形结构中的指定位置添加一个节点
this.treeList.AppendNode(curnode.Id,nextnode);
}
//数据库接受改变
this.dataSet_Data1.物料分类.AcceptChanges();
//调用exchang方法,实现数据库中顺序号的改变
Exchange(currow["编号"].ToString(), nextrow["编号"].ToString());
//调用页面刷新方法
LoadData();
//展开所以的树节点
this.treeList.ExpandAll();
//把焦点置在当前节点的下一个节点上
this.treeList.SetFocusedNode(nextnode.NextNode);
}
/**
*
* 交换物料分类表字段顺序号的实现方法
*
*/
private void Exchange(string id1, string id2) {
//初始化顺序号1
int id_one = 0;
//初始化顺序号2
int id_two = 0;
//把从数据库中获得的值传给顺序号
id_one = this.物料分类TableAdapter1.ScalarQuery顺序号(Convert.ToInt32(id1)).Value;
id_two = this.物料分类TableAdapter1.ScalarQuery顺序号(Convert.ToInt32(id2)).Value;
//调用修改数据库信息的数据源
this.物料分类TableAdapter1.UpdateQuery修改(id_one, Convert.ToInt32(id2));
this.物料分类TableAdapter1.UpdateQuery修改(id_two, Convert.ToInt32(id1));
}
这个程序做得很辛苦,值得珍藏!
分享到:
相关推荐
本文将详细介绍如何在C#中使用DevExpress的`Treelist`控件,包括添加节点、获取单元格数据、删除节点、添加图片以及设置背景颜色等操作。 #### 二、添加节点 `Treelist`的一个核心功能就是能够动态地添加节点。根据...
在TreeList中,每个节点可能有子节点,这些子节点又可能有它们自己的子节点,以此类推,形成一个深度未知的树状结构。 TreeList控件通常提供API或事件,允许开发者访问和操作其节点。例如,它可能有一个`Nodes`集合...
本篇将详细介绍如何在DevExpress TreeList中设置图片节点的背景色。 首先,我们可以利用DevExpress TreeList的`CustomDrawNodeImages`事件来实现自定义绘制节点图像的功能。这个事件在控件绘制节点图像时触发,允许...
在DevExpress的TreeList控件中,我们可以利用`AfterCheckNode`事件来监听用户对节点的勾选操作。在该事件的处理函数中,我们可以编写逻辑来同步父子节点的CheckState。 文章提供的代码实现了一个静态方法`...
在“DevExpress TreeListLookUpEdit 判断有子节点时展开”这个场景中,开发者可能希望实现一种交互模式:当用户双击一个节点时,如果该节点有子节点,则进行收缩;如果单击节点,那么只有在没有子节点的情况下才选择...
在 MouseDown 事件中,判断如果用户右击了某个节点,则显示右击菜单。下面是一个示例代码: `private void treeList1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { // ...
- 当用户在SearchControl中输入查询文本时,可以监听其`TextChanged`事件,调用TreeList的`FindBestNode`或`FindNodeByText`方法来定位匹配的节点,并可能需要滚动到相应的节点位置。 4. **TreeList高级特性** - ...
在这个场景中,我们将探讨如何使用C#编程语言,结合`TreeList`控件和XML数据来构建树节点,从而实现一个功能丰富的用户界面。 首先,让我们了解`TreeList`。`TreeList`通常在.NET Framework中的DevExpress库中提供...
在上下文中,递归用于遍历TreeList的层级结构,从选定节点开始,逐级向上检查父节点,直到找到满足特定条件的公共父节点。 核心功能代码如下: 1. `GetParentNode` 方法:这是一个递归方法,接收一个当前节点和一...
本文将详细解析如何利用DevExpress的TreeList控件实现向上递归获取符合条件的父节点这一功能。 首先,我们要理解TreeList的基本概念。TreeList控件允许用户以树形结构显示数据,每个节点可以有子节点,形成层级结构...
本文实例讲述了DevExpress实现TreeList按条件隐藏节点CheckBox的方法,在项目开发中有一定的使用价值。具体的实现方法如下: 主要功能代码如下: /// /// 隐藏CheckBox /// 说明 /// 在CustomDrawNodeCheckBox事件...
2. **节点模板**:利用TreeList的节点模板功能,可以定制节点内容,展示电话号码。 3. **点击事件**:监听书名节点的点击事件,触发电话号码的展示。 4. **拨号功能**:点击电话号码后,系统需要调用拨号API或插件,...
TreeList适用于需要在单元格中添加数据的情况,它能够以树状结构显示数据并支持多层节点管理。而GridControl1更适合于单纯的数据读取或检索,因为它以表格形式展示数据,而不具备TreeList的层级管理特性。 二、...
TreeList是一种数据结构,它结合了树形结构和表格数据的特点,通常用于显示层次结构的数据,并且可以在每一层节点上展示多个属性。在本场景中,我们讨论的是一个纯C实现的TreeList,具备可折叠和可编辑的功能,这...
当需要对TreeList进行操作,如添加、删除或更新节点时,KeyFieldName属性就变得至关重要,因为它确保了数据操作的准确性。 三、ParentFieldName属性 ParentFieldName属性则定义了数据源中表示父节点关系的字段名。...
首先,`TreeList`控件通常用于Windows Forms或ASP.NET环境中,它允许用户以树形结构显示数据,每个节点可以有子节点,形成一个多级结构。在C#中,我们可以使用DevExpress、Telerik等第三方库来获取`TreeList`控件,...
6. 编程操作:除了通过界面交互,还可以通过编程来添加、删除、移动节点,或者改变节点的状态。 7. 性能优化:对于大数据集,可能需要分页加载或懒加载数据,以提高性能。递归加载就是一种实现方式,只在需要时加载...