因爲經常要使用到TreeList,查詢的內容也是反反覆覆,把經常用到的相關代碼整理了一下
- 綁定數據源:
指定DataSource爲對應 的DataTable,指定KeyFieldName爲表主鍵字段,ParentFieldName爲表指向主鍵的外鍵字段名
DataTable dtSourceData = new DataTable();//或者從數據庫中獲取
treeList1.DataSource = dtSourceData ;
treeList1.KeyFieldName = "id";
treeList1.ParentFieldName = "pid";
treeList1.BestFitColumns();
this.treeList1.ExpandAll();
- 設置選擇框
treeList1.OptionsView.ShowCheckBoxes = true;
- 如何隱藏TreeList的列頭
設置TreeListr的OptionsView的ShowColumns屬性爲:False
- 設置父子節點全選狀態:
/// <summary>
/// 設置子節點的狀態
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private void SetCheckedChildNodes(DevExpress.XtraTreeList.Nodes.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(DevExpress.XtraTreeList.Nodes.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);
}
}
上面的兩個方法在TreeList_AfterCheckNode裏面觸發:
private void treeDatacheckItem_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
{
SetCheckedChildNodes(e.Node, e.Node.CheckState);
SetCheckedParentNodes(e.Node, e.Node.CheckState);
}
- 獲取選擇的子節點、父節點
List<string> lstPID = new List<string>();
List<string> lstCID = new List<string>();
/// <summary>
/// 獲取treelist勾選的節點(區分子節點和父節點)
/// </summary>
private void RecursionNodes(TreeListNodes Nodes)
{
foreach (TreeListNode node in Nodes)
{
//// 如果當前節點下還包括子節點,調用遞歸
if (node.Nodes.Count > 0)
{
//節點的選中狀態Indeterminate(一般爲父節點的狀態,當父節點下有子節點勾選,但父節點沒有被勾選是節點爲改狀態)
if (node.CheckState == CheckState.Indeterminate)
{
//關鍵:轉換爲DataRowView可以得到節點屬性值
DataRowView drv = treeDatacheckItem.GetDataRecordByNode(node) as DataRowView;
if (drv != null)
{
string id = drv["id"].ToString();
lstPID.Add(id);//根據判斷選中是否添加該節點
}
RecursionNodes(node.Nodes);
}
if (node.CheckState == CheckState.Checked)
{
DataRowView drv = treeDatacheckItem.GetDataRecordByNode(node) as DataRowView;
if (drv != null)
{
string id = drv["id"].ToString();
lstPID.Add(id);
}
RecursionNodes(node.Nodes);
}
}
else
{
if (node.CheckState == CheckState.Checked)
{
DataRowView drv = treeDatacheckItem.GetDataRecordByNode(node) as DataRowView;
if (drv != null)
{
string id = drv["id"].ToString();
lstCID.Add(id);
}
}
// 也可以設置節點的值
node.SetValue(1, "Hello World!");
}
}
}
- 定位到某一節點
TreeListNode pFocusNode = this.treeList1.FindNodeByID(int.Parse("ID"));
//TreeListNode pFocusNode2 = this.treeList1.FindNodeByFieldValue("字段名","字段值");
//TreeListNode pFocusNode3 = this.treeList1.FindNodeByKeyID("綁定的keyID");
treeList1.FocusedNode = pFocusNode;