DevExpress中的TreeView的使用实例
标签:
devexpresstreeview实例杂谈 |
在项目中需要构建具有三级结点的目录树,所以独自花了一番功夫研究了下,现整理如下:
///
/// 构建树结点
///
/// 结点数据源
private void
initTreeView(DataSet ds)
{
DataTable dt = ds.Tables[0];
int row = dt.Rows.Count;
int First = -1, Second = -1, Third = -1;
TreeNode tmp1 = new TreeNode(), tmp2 = new
TreeNode();
treeView1.Nodes.Clear();
//构建TreeView
for (int i = 0; i < row; i++)
{
//构建第一节点
if
(Convert.ToInt32(dt.Rows[i]["SysID"]) != First)
{
First =
Convert.ToInt32(dt.Rows[i]["SysID"]);
treeView1.Nodes.Add(dt.Rows[i]["SysID"].ToString(),
dt.Rows[i]["SName"].ToString());
tmp1 =
treeView1.Nodes[treeView1.Nodes.Count - 1];
treeView1.SelectedNode = tmp1;
//选中这一结点,以便往下构建第二结点
treeView1.SelectedNode.Tag =
1;
//第一结点标识
}
//构建第二结点
if
(Convert.ToInt32(dt.Rows[i]["RepType"]) != Second)
{
if
(treeView1.SelectedNode.Nodes.Count > 1)
{
treeView1.SelectedNode = tmp1;
}
Second =
Convert.ToInt32(dt.Rows[i]["RepType"]);
treeView1.SelectedNode.Nodes.Add(dt.Rows[i]["RepType"].ToString(),
dt.Rows[i]["TypeName"].ToString());
tmp2 =
treeView1.SelectedNode.Nodes[treeView1.SelectedNode.Nodes.Count -
1];
treeView1.SelectedNode = tmp2;
//选中这一结点,以便往下构建第三结点
treeView1.SelectedNode.Tag =
2;
//第二结点标识
}
//构建第三结点
if
(Convert.ToInt32(dt.Rows[i]["RepID"]) != Third)
{
Third =
Convert.ToInt32(dt.Rows[i]["RepID"]);
treeView1.SelectedNode.Nodes.Add(dt.Rows[i]["RepID"].ToString(),
dt.Rows[i]["RepName"].ToString());
treeView1.SelectedNode.Nodes[Third.ToString()].Tag
= 3;
//第三结点标识
}
}
}
///
/// 初始化时选中结点
///
private void
CheckNodes()
{
int row = gridView1.FocusedRowHandle;
int empid =
Convert.ToInt32(ds.Tables[0].Rows[row]["EmpID"]);
try
{
//获取被选中的结点目录
DataSet
CheckDs = RP.InitReportList(empid, FShopID);
ClearNodesState();
//此处是清除结点状态,即默认不选中(自定义)
//选中结点
for (int i
= 0; i < CheckDs.Tables[0].Rows.Count; i++)
{
string key =
CheckDs.Tables[0].Rows[i]["RepID"].ToString();
for (int fir = 0; fir <
treeView1.Nodes.Count; fir++)
{
for (int sec = 0; sec <
treeView1.Nodes[fir].Nodes.Count; sec++)
{
//如果存在结点,则选中
if
(treeView1.Nodes[fir].Nodes[sec].Nodes.ContainsKey(key))
{
int thr =
treeView1.Nodes[fir].Nodes[sec].Nodes.IndexOfKey(key);
treeView1.Nodes[fir].Nodes[sec].Nodes[thr].Checked
= true;
//选中第三结点
treeView1.Nodes[fir].Nodes[sec].Checked = true;
//选中第二结点
treeView1.Nodes[fir].Checked =
true;
//选中第一结点
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(this.FindForm(),
ex.Message);
}
}
///
/// 清除树节点选中状态
///
private void
ClearNodesState()
{
//第一结点
for (int fir = 0; fir < treeView1.Nodes.Count;
fir++)
{
//第二结点
for (int
sec = 0; sec < treeView1.Nodes[fir].Nodes.Count; sec++)
{
//第三结点
for (int thi = 0; thi <
treeView1.Nodes[fir].Nodes[sec].Nodes.Count; thi++)
{
treeView1.Nodes[fir].Nodes[sec].Nodes[thi].Checked
= false;
}
treeView1.Nodes[fir].Nodes[sec].Checked =
false;
}
treeView1.Nodes[fir].Checked = false;
}
}
private UpdateState IsUpdate=UpdateState.No;
//定义修改状态变量
///
/// 修改状态枚举类型
///
private enum UpdateState
{
No = 0,
yes = 1
}
///
/// 树节点选中状态更改事件
///
///
///
private void treeView1_AfterCheck(object sender,
TreeViewEventArgs e)
{
if
(IsUpdate == UpdateState.yes)
{
treeView1.SelectedNode =
e.Node;
IsUpdate =
UpdateState.No;
if (!UpdRep())
{
MessageBox.Show(this, "操作失败,请重新尝试");
}
else
{
CheckNodes();
}
}
}
///
/// 树点击事件
///
///
///
private void treeView1_Click(object sender,
EventArgs e)
{
//启用报表查看权修改
IsUpdate =
UpdateState.yes;
}
实现的功能:
其中,各级结点都是从同一个数据表获取的,需要根据三个字段值进行判断并绑定
构造完目录树外,还需要初始化树节点的选中状态
(是从另一数据表读取的)
为实现结点的Checked更改触发事件,自定义了一个修改标志变量.该变量初始为不修改态,当鼠标点击树后即处于可修改状态,此时即可触发事件。
特别声明:此处设置变量的意义在于,使得结点状态更改的触发事件不受结点初始化时的影响,从而使程序不致混乱
此外,其实Tag属性是很有作用的,可以将所有的信息打包成一个对象赋值给Tag,所以我们可以随心所欲的随意发挥

加载中…