在最近的工作中,使用到了DevExpress中的XtraTreeList用法,正好借此機會研究一下此控件的應用,現将其應用技巧與大家分享一下。
1、使用XtraTreeList綁定資料(資料格式可以為ArrayList形式)
我們執行個體說明要實作下面樣式的窗體:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwkzX39GZhh2csATMflHLwEzX4xSZz91ZsADMx8FdsYkRGZkRG9lcvx2bjxSa2EWNhJTW1AlUxEFeVRUUfRHelRHL2EzXlpXazxyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3PnVGcq5iM0MzM4czMhZWZjBjZiFWOwUWZkRWMyczY3YmMhdjN58CX2AzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL2M3Lc9CX6MHc0RHaiojIsJye.jpeg)
首先,在Run Designer裡面添加兩個列(columns),設定兩列的屬性,其中第一列“名稱”為string格式,FieldName為Name;第二列“選 擇”将ColumnEdit屬性設定為CheckEdit1,FieldName為IsChecked,設定完畢。
其次可以編寫一個類,用來綁定TreeList,針對此TreeList窗體,其類代碼設定如下:
public class TestTreeList
{
public TestTreeList()
{
}
//名稱字段變量
private string m_sName = string.Empty;
//選擇字段變量
private bool m_bIsChecked = false;
//子Node節點ID變量
private int m_iID = -1;
//父Node節點ID變量
private int m_iParentID = -1;
public int ID
get
{
return m_iID;
}
set
{
m_iID = value;
public int ParentID
return m_iParentID;
m_iParentID = value;
public string Name
return m_sName;
m_sName = value;
public bool IsChecked
get
return m_bIsChecked;
m_bIsChecked = value;
}
類構造完成,在FormLoad裡面借助此類對TreeList進行綁定:
private void Form1_Load(object sender, EventArgs e)
ArrayList pList = new ArrayList();
TestTreeList p = new TestTreeList();
p.Name = "測試1";
p.IsChecked = true;
p.ID = 1;
pList.Add(p);
TestTreeList q = new TestTreeList();
q.Name = "測試2";
q.IsChecked = false;
q.ParentID = 1;
q.ID = 2;
pList.Add(q);
this.treeList1.DataSource = pList;
this.treeList1.RefreshDataSource();
這樣就可以構造出一個簡單的TreeList應用方法,程式運作結果可得第一幅圖所示。
2、DevTreeList改變樣式:
如果将TreeList控件改變成如下樣式(同第一幅圖不一樣,将Check控件顯示在節點最前面)。
可以直接修改其控件的ShowCheckBoxes屬性即可(其它樣式類似如下)。
3、DevTreeList非綁定形式實作:動态加載,建構:
運作樣式如下:
實作動态加載的幾個函數實作如下:
/// <summary>
/// 動态建立TreeList的Column,一列為圖層名,一列為是否統計列Check控件
/// </summary>
private void creatTreeListControl()
DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumnLayerName= new DevExpress.XtraTreeList.Columns.TreeListColumn();
treeListColumnLayerName.Caption = "名稱";
treeListColumnLayerName.FieldName = "LayerName";
treeListColumnLayerName.MinWidth = 38;
treeListColumnLayerName.Name = "treeListColumnLayerName";
treeListColumnLayerName.Visible = true;
treeListColumnLayerName.VisibleIndex = 0;
treeListColumnLayerName.Width = 111;
DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumnStatisticValue=new DevExpress.XtraTreeList.Columns.TreeListColumn();
treeListColumnStatisticValue.Caption = "統計值";
treeListColumnStatisticValue.ColumnEdit = this.repositoryItemCheckEdit1;
treeListColumnStatisticValue.FieldName = "StatisticValue";
treeListColumnStatisticValue.Name = "treeListColumnStatisticValue";
treeListColumnStatisticValue.Visible = true;
treeListColumnStatisticValue.VisibleIndex = 1;
this.treeListLayerControl.Columns.AddRange(new DevExpress.XtraTreeList.Columns.TreeListColumn[] {
treeListColumnLayerName,
treeListColumnStatisticValue});
this.treeListLayerControl.Nodes.Clear();
this.treeListLayerControl.Refresh();
/// 動态建立TreeList Layer Node節點
/// <param name="layerName"></param>
/// <param name="check"></param>
private void creatMainLayerNode(string layerName,bool check)
this.treeListLayerControl.BeginUnboundLoad();
this.treeListLayerControl.AppendNode(new object[] { layerName,check}, -1);
this.treeListLayerControl.EndUnboundLoad();
/// <summary>
/// 動态建立TreeList 字段屬性值 Node節點
/// <param name="ValueName"></param>
/// <param name="ID"></param>
private void CreatChildNode(string ValueName, bool check,int ID)
this.treeListLayerControl.AppendNode(new object[] { ValueName, check }, ID);
/// <summary>
/// 獲得圖層名節點的Index值
/// <param name="ParentNodeName"></param>
/// <returns></returns>
private int getParentID(string ParentNodeName)
int i = -1;
for (i = 0; i < this.treeListLayerControl.Nodes.Count;i++ )
if (this.treeListLayerControl.Nodes[i][0].ToString() == ParentNodeName)
{
break;
}
return i;
/// 當點選Node事件發生改變(點選主節點時,其子節點跟着主節點變化)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListLayerControl_CellValueChanging(object sender, DevExpress.XtraTreeList.CellValueChangedEventArgs e)
if (e.Column.Name.Equals("treeListColumnStatisticValue") && e.Node.HasChildren)
object objCol = this.treeListLayerControl.Columns[1];
for (int i = 0; i < e.Node.Nodes.Count; i++)
{
e.Node.Nodes[i].SetValue(objCol, e.Value);
e.Node.SetValue(objCol, e.Value);
建立子節點方法:
int indexLayerTree = this.getParentID(playerInfo.LayerName);
if (indexLayerTree == -1)
return;
CreatChildNode(sValue, false, this.treeListLayerControl.Nodes[indexLayerTree].Id);
其建立主節點和建立子節點方法類似,比建立子節點簡單的多。
4、總結