工作中經常用的的是第三發控件Developer Express,相信大家都知道它的強大功能,這次用到了TreeList做了一個權限的管理,發現TreeList非常好用,大家可以看它自帶的 Demo就知道了,功能很多,這里我就把我用到的說出來,大家一起交流學習。
?Skelta BPM.NET(全球第一.NET工作流引擎) | ?Visual WebGui (完美的用戶界面解決方案) |
?List & Label(圖表報表生成控件) | ?DXperience Uni Premium 白金版(慧都獨家) |
TreeList有一個KeyFieldName和ParentFieldName,這2個非常重要,只要構造一個DataTable賦值給 TreeList的DataSource,這個DataTable里面要有2列是必須的,因為這2列要賦給上面說的KeyFieldName和 ParentFieldName,先不說上面意思,樹應該是從根節點遞歸、遞歸、一直往下遞歸到葉子,KeyFieldName和 ParentFieldName就起到這個作用,比如:下面的一個DataTable:
KeyFieldName | ParentFieldName | NodeName | NodeCode | Others |
1 | Null | 根節點1名稱 | 根節點1編碼 | 其他 |
2 | 1 | 節點1子節點名稱 | 節點1子節點編碼 | 其他 |
3 | 1 | 節點1子節點名稱 | 節點1子節點編碼 | 其他 |
4 | Null | 根節點4名稱 | 根節點4編碼 | 其他 |
5 | 4 | 節點4子節點名稱 | 節點4子節點編碼 | 其他 |
6 | 5 | 節點5子節點名稱 | 節點5子節點編碼 | 其他 |
c++ listnode、 這時,如果把這個DataTable賦給TreeList的話,就會產生下面的一棵樹:
?
下面是一個構造TreeList的數據源的簡單示例:
/// 構造一棵樹型表結構
/// </summary>
/// <returns></returns>
private DataTable CreateTreeListTable()
{
DataTable dt = new DataTable();
DataColumn dcOID = new DataColumn("KeyFieldName", Type.GetType("System.Int32"));
DataColumn dcParentOID = new DataColumn("ParentFieldName", Type.GetType("System.Int32"));
DataColumn dcNodeName = new DataColumn("NodeName", Type.GetType("System.String"));
DataColumn dcNodeCode = new DataColumn("NodeCode", Type.GetType("System.String"));
DataColumn dcOthers = new DataColumn("Others", Type.GetType("System.String"));
dt.Columns.Add(dcOID);
dt.Columns.Add(dcParentOID);
dt.Columns.Add(dcNodeName);
dt.Columns.Add(dcNodeCode);
dt.Columns.Add(dcOthers);
//以上代碼完成了DataTable的構架,但是里面是沒有任何數據的
DataRow dr1 = dt.NewRow();
dr1["KeyFieldName"] = 1;
dr1["ParentFieldName"] = DBNull.Value;
dr1["NodeName"] = "根節點名稱";
dr1["NodeCode"] = "根節點編碼";
dr1["Others"] = "其他";
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["KeyFieldName"] = 2;
dr2["ParentFieldName"] = 1;
dr2["NodeName"] = "節點子節點名稱";
dr2["NodeCode"] = "節點子節點編碼";
dr2["Others"] = "其他";
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3["KeyFieldName"] = 3;
dr3["ParentFieldName"] = 1;
dr3["NodeName"] = "節點子節點名稱";
dr3["NodeCode"] = "節點子節點編碼";
dr3["Others"] = "其他";
dt.Rows.Add(dr3);
DataRow dr4 = dt.NewRow();
dr4["KeyFieldName"] = 4;
dr4["ParentFieldName"] = DBNull.Value;
dr4["NodeName"] = "根節點名稱";
dr4["NodeCode"] = "根節點編碼";
dr4["Others"] = "其他";
dt.Rows.Add(dr4);
DataRow dr5 = dt.NewRow();
dr5["KeyFieldName"] = 5;
dr5["ParentFieldName"] = 4;
dr5["NodeName"] = "節點子節點名稱";
dr5["NodeCode"] = "節點子節點編碼";
dr5["Others"] = "其他";
dt.Rows.Add(dr5);
DataRow dr6 = dt.NewRow();
dr6["KeyFieldName"] = 6;
dr6["ParentFieldName"] = 5;
dr6["NodeName"] = "節點子節點名稱";
dr6["NodeCode"] = "節點子節點編碼";
dr6["Others"] = "其他";
dt.Rows.Add(dr6);
return dt;
}
?
java arraylist和linkedlist區別。好了,一個TreeList構造完成,下面就是TreeList的一些常用用法,都比較簡單,這里就直接上代碼了,代碼中有簡單的注釋,大家一看就明白哦。
/// 點擊節點前
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeLstModuleAction_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
{
e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);
}
/// <summary>
/// 點擊節點后
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeLstModuleAction_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
{
SetCheckedChildNodes(e.Node, e.Node.CheckState);
SetCheckedParentNodes(e.Node, e.Node.CheckState);
}
/// <summary>
/// 選擇子節點時觸發
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private void SetCheckedChildNodes(TreeListNode node, CheckState check)
{
for (int i = 0; i < node.Nodes.Count; i++)
{
node.Nodes[i].CheckState = check;
SetCheckedChildNodes(node.Nodes[i], check);
}
}
/// <summary>
/// 選擇父節點時觸發
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private void SetCheckedParentNodes(TreeListNode node, CheckState check)
{
if (node.ParentNode != null)
{
bool b = false;
CheckState state;
for (int i = 0; i < node.ParentNode.Nodes.Count; i++)
{
state = (CheckState)node.ParentNode.Nodes[i].CheckState;
if (!check.Equals(state))
{
b = !b;
break;
}
}
node.ParentNode.CheckState = b ? CheckState.Indeterminate : check;
SetCheckedParentNodes(node.ParentNode, check);
}
}
/// <summary>
/// 判斷此節點下的所有孩子節點是否選中
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private Boolean IsChildsChecked(TreeListNode node)
{
for (int i = 0; i < node.Nodes.Count; i++)
{
if (node.Nodes[i].CheckState == CheckState.Unchecked)
return false;
if (node.Nodes[i].HasChildren)
IsChildsChecked(node.Nodes[i]);
}
return true;
}
?
好了,至此,關于TreeList的一些常用用法就說到這了,大家如果有好的想法,請不吝賜教,謝謝!