/// <summary>
/// 通过连接SDE数据库构造一个与数据集一样的树 杨 20120813
/// </summary>
public partial class XtraForm1 : DevExpress.XtraEditors.XtraForm
{
/// <summary>
/// 存储TreeList控件的数据源
/// </summary>
DataTable pTableTreeList = new DataTable();
IWorkspaceFactory pWorkspaceFactory = new SdeWorkspaceFactoryClass();
IWorkspace pWorkspace;
IFeatureWorkspace pFeatureWorkspace;
//未被选中的集合
private List<string> lstUncheckedNodeName;
public XtraForm1()
{
InitializeComponent();
pTableTreeList.Clear();
pTableTreeList = BulidTable();
}
private void XtraForm1_Load(object sender, EventArgs e)
{
this.ConnectSDE();
this.InitTreeList();
}
//构造存储TreeList数据源的表
private DataTable BulidTable()
{
//为图层配置信息表中添加KeyFieldID,ParentFieldID,NodeName列
DataTable dtResult = new DataTable();
DataColumn KeyID = new DataColumn("KeyFieldID", Type.GetType("System.Int32"));
DataColumn ParentID = new DataColumn("ParentID", Type.GetType("System.Int32"));
DataColumn NodeName = new DataColumn("NodeName", Type.GetType("System.String"));
dtResult.Columns.Add(KeyID);
KeyID.SetOrdinal(0);//设置为第一列
dtResult.Columns.Add(ParentID);
ParentID.SetOrdinal(1);//设置为第二列
dtResult.Columns.Add(NodeName);
NodeName.SetOrdinal(2);//设置为第三列
return dtResult;
}
private void ConnectSDE()
{
string Server = "*.*.*.*";
string User = "DXSDE";
string PassWord = "DXSDE";
//设置连接SDE的属性
IPropertySet pPropertySet = new PropertySetClass();
pPropertySet.SetProperty("Server", Server);
pPropertySet.SetProperty("SERVICE", "esri_sde");
pPropertySet.SetProperty("INSTANCE", "5151");
pPropertySet.SetProperty("USER", User);
pPropertySet.SetProperty("PASSWORD", PassWord);
pPropertySet.SetProperty("VERSION", "sde.DEFAULT");
//通过以上设置的参数将数据库的数据通过SDE读入工作空间
IAoInitialize pAoInitialize = new AoInitialize();
pAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
pWorkspace = pWorkspaceFactory.Open(pPropertySet, 0);
IEnumDataset pEnumDataSet = pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
pEnumDataSet.Reset();
IDataset pDataSet;
IFeatureDataset pFeatureDataset;
IFeatureLayer pFeatureLayer;
pDataSet = pEnumDataSet.Next();
int parentID = 1;
int i = 1;
while ((pDataSet is IFeatureDataset) && (pDataSet != null))
{
if ((pDataSet.Name.Split('.')[0] == "DXSDE") || (pDataSet.Name.Split('.')[0] == "RQGWSDE"))
{
//构建树形图层显示
DataRow drParents = pTableTreeList.NewRow();
drParents[0] = i;//根节点
parentID = i;
i++;
drParents[2] = pDataSet.Name;
pTableTreeList.Rows.Add(drParents);
pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(pDataSet.Name);
IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets;
pEnumDataset1.Reset();
IDataset pDataset1 = pEnumDataset1.Next();
while ((pDataset1 is IFeatureClass) && (pDataSet != null))
{
pFeatureLayer = new FeatureLayerClass();
DataRow drSon = pTableTreeList.NewRow();
drSon[0] = i++;
drSon[1] = parentID;
pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset1.Name);
if ((pDataset1.Name != null) || (pDataset1.Name != ""))
{
if (!pDataset1.Name.Contains("Junctions"))
{
string pName = pDataset1.Name.Split('.')[1].ToString(); ;
drSon[2] = pName;
pTableTreeList.Rows.Add(drSon.ItemArray);
}
}
pDataset1 = pEnumDataset1.Next();
}
parentID++;
}
pDataSet = pEnumDataSet.Next();
}
treeList1.DataSource = pTableTreeList;
treeList1.ExpandAll();
treeList1.RefreshDataSource();
}
/// <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);
}
}
/// <summary>
/// 在初始化窗体的时候使TreeList控件的checkboxes全部处于选中状态
/// </summary>
private void InitTreeList()
{
if (treeList1.Nodes.Count > 0)
{
foreach (TreeListNode root in treeList1.Nodes)
{
root.CheckState = CheckState.Checked;
foreach (TreeListNode node in root.Nodes)
{
node.CheckState = CheckState.Checked;
}
}
}
}
/// <summary>
/// 得到未被选中的Node
/// </summary>
/// <param name="parentNode"></param>
private void GetUncheckedNodeName(TreeListNode parentNode)
{
if (parentNode.Nodes.Count == 0)
{
return;//递归终止
}
foreach (TreeListNode node in parentNode.Nodes)
{
//判断条件:未被选中
if (node.CheckState == CheckState.Unchecked)
{
//关键代码 获取数据
DataRowView drv = this.treeList1.GetDataRecordByNode(node) as DataRowView;
if (drv != null)
{
string pNodeName = (string)drv["NodeName"];
lstUncheckedNodeName.Add(pNodeName);
}
}
//GetUncheckedNodeName(node);
}
}
//设置checkbox选中后的父节点、子节点状态
private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
{
SetCheckedChildNodes(e.Node, e.Node.CheckState);
SetCheckedParentNodes(e.Node, e.Node.CheckState);
}
//设置checkbox选中前的父节点、子节点状态
private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
{
e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);
}
//未被选中按钮
private void simpleButton1_Click(object sender, EventArgs e)
{
lstUncheckedNodeName = new List<string>();
if (treeList1.Nodes.Count > 0)
{
foreach (TreeListNode root in treeList1.Nodes)
{
GetUncheckedNodeName(root);
}
}
string str = string.Empty;
foreach (string pUncheckedName in lstUncheckedNodeName)
{
str = str + "," + "'" + pUncheckedName + "'";
}
XtraMessageBox.Show("未被选中的是:" + str + ";", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// 通过连接SDE数据库构造一个与数据集一样的树 杨 20120813
/// </summary>
public partial class XtraForm1 : DevExpress.XtraEditors.XtraForm
{
/// <summary>
/// 存储TreeList控件的数据源
/// </summary>
DataTable pTableTreeList = new DataTable();
IWorkspaceFactory pWorkspaceFactory = new SdeWorkspaceFactoryClass();
IWorkspace pWorkspace;
IFeatureWorkspace pFeatureWorkspace;
//未被选中的集合
private List<string> lstUncheckedNodeName;
public XtraForm1()
{
InitializeComponent();
pTableTreeList.Clear();
pTableTreeList = BulidTable();
}
private void XtraForm1_Load(object sender, EventArgs e)
{
this.ConnectSDE();
this.InitTreeList();
}
//构造存储TreeList数据源的表
private DataTable BulidTable()
{
//为图层配置信息表中添加KeyFieldID,ParentFieldID,NodeName列
DataTable dtResult = new DataTable();
DataColumn KeyID = new DataColumn("KeyFieldID", Type.GetType("System.Int32"));
DataColumn ParentID = new DataColumn("ParentID", Type.GetType("System.Int32"));
DataColumn NodeName = new DataColumn("NodeName", Type.GetType("System.String"));
dtResult.Columns.Add(KeyID);
KeyID.SetOrdinal(0);//设置为第一列
dtResult.Columns.Add(ParentID);
ParentID.SetOrdinal(1);//设置为第二列
dtResult.Columns.Add(NodeName);
NodeName.SetOrdinal(2);//设置为第三列
return dtResult;
}
private void ConnectSDE()
{
string Server = "*.*.*.*";
string User = "DXSDE";
string PassWord = "DXSDE";
//设置连接SDE的属性
IPropertySet pPropertySet = new PropertySetClass();
pPropertySet.SetProperty("Server", Server);
pPropertySet.SetProperty("SERVICE", "esri_sde");
pPropertySet.SetProperty("INSTANCE", "5151");
pPropertySet.SetProperty("USER", User);
pPropertySet.SetProperty("PASSWORD", PassWord);
pPropertySet.SetProperty("VERSION", "sde.DEFAULT");
//通过以上设置的参数将数据库的数据通过SDE读入工作空间
IAoInitialize pAoInitialize = new AoInitialize();
pAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
pWorkspace = pWorkspaceFactory.Open(pPropertySet, 0);
IEnumDataset pEnumDataSet = pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
pEnumDataSet.Reset();
IDataset pDataSet;
IFeatureDataset pFeatureDataset;
IFeatureLayer pFeatureLayer;
pDataSet = pEnumDataSet.Next();
int parentID = 1;
int i = 1;
while ((pDataSet is IFeatureDataset) && (pDataSet != null))
{
if ((pDataSet.Name.Split('.')[0] == "DXSDE") || (pDataSet.Name.Split('.')[0] == "RQGWSDE"))
{
//构建树形图层显示
DataRow drParents = pTableTreeList.NewRow();
drParents[0] = i;//根节点
parentID = i;
i++;
drParents[2] = pDataSet.Name;
pTableTreeList.Rows.Add(drParents);
pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(pDataSet.Name);
IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets;
pEnumDataset1.Reset();
IDataset pDataset1 = pEnumDataset1.Next();
while ((pDataset1 is IFeatureClass) && (pDataSet != null))
{
pFeatureLayer = new FeatureLayerClass();
DataRow drSon = pTableTreeList.NewRow();
drSon[0] = i++;
drSon[1] = parentID;
pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset1.Name);
if ((pDataset1.Name != null) || (pDataset1.Name != ""))
{
if (!pDataset1.Name.Contains("Junctions"))
{
string pName = pDataset1.Name.Split('.')[1].ToString(); ;
drSon[2] = pName;
pTableTreeList.Rows.Add(drSon.ItemArray);
}
}
pDataset1 = pEnumDataset1.Next();
}
parentID++;
}
pDataSet = pEnumDataSet.Next();
}
treeList1.DataSource = pTableTreeList;
treeList1.ExpandAll();
treeList1.RefreshDataSource();
}
/// <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);
}
}
/// <summary>
/// 在初始化窗体的时候使TreeList控件的checkboxes全部处于选中状态
/// </summary>
private void InitTreeList()
{
if (treeList1.Nodes.Count > 0)
{
foreach (TreeListNode root in treeList1.Nodes)
{
root.CheckState = CheckState.Checked;
foreach (TreeListNode node in root.Nodes)
{
node.CheckState = CheckState.Checked;
}
}
}
}
/// <summary>
/// 得到未被选中的Node
/// </summary>
/// <param name="parentNode"></param>
private void GetUncheckedNodeName(TreeListNode parentNode)
{
if (parentNode.Nodes.Count == 0)
{
return;//递归终止
}
foreach (TreeListNode node in parentNode.Nodes)
{
//判断条件:未被选中
if (node.CheckState == CheckState.Unchecked)
{
//关键代码 获取数据
DataRowView drv = this.treeList1.GetDataRecordByNode(node) as DataRowView;
if (drv != null)
{
string pNodeName = (string)drv["NodeName"];
lstUncheckedNodeName.Add(pNodeName);
}
}
//GetUncheckedNodeName(node);
}
}
//设置checkbox选中后的父节点、子节点状态
private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
{
SetCheckedChildNodes(e.Node, e.Node.CheckState);
SetCheckedParentNodes(e.Node, e.Node.CheckState);
}
//设置checkbox选中前的父节点、子节点状态
private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
{
e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);
}
//未被选中按钮
private void simpleButton1_Click(object sender, EventArgs e)
{
lstUncheckedNodeName = new List<string>();
if (treeList1.Nodes.Count > 0)
{
foreach (TreeListNode root in treeList1.Nodes)
{
GetUncheckedNodeName(root);
}
}
string str = string.Empty;
foreach (string pUncheckedName in lstUncheckedNodeName)
{
str = str + "," + "'" + pUncheckedName + "'";
}
XtraMessageBox.Show("未被选中的是:" + str + ";", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
下面的是结果: