前几天公司做了一个项目,在我做的子模块中,有节点上下移动的功能,要求如下:
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));
}
这个程序做得很辛苦,值得珍藏!
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));
}
这个程序做得很辛苦,值得珍藏!