C#+AE:如何用TreeList控件實現屬性查詢


閑話不多,代碼如下:

     private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "*.mxd|*.mxd";
            ofd.ShowDialog();

            string fp = ofd.FileName;
            axMapControl1.LoadMxFile(fp,0,Type.Missing);
        }

        bool bu = false;
        private void button2_Click(object sender, EventArgs e)
        {
            bu = true;

        }

 

     private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
        {

            try
            {
                if (bu)
                {
                    //先創建一張表,按照自己的想法;需要兩張表???
                    //或者創建List也行,需要合適的方法賦值給TreeList
                    DataTable pDataTable = new DataTable();
                    pDataTable.Columns.Add("ID");
                    pDataTable.Columns.Add("Name");
                    pDataTable.Columns.Add("ParentID");

                    DataRow pDataRow = null;
                    for (int i = 0; i < axMapControl1.Map.LayerCount;i++ )
                    {
                        pDataRow=pDataTable.NewRow();
                        string lyrName = axMapControl1.Map.get_Layer(i).Name;
                        pDataRow["ID"] = lyrName;
                        pDataRow["Name"] = lyrName;
                        pDataRow["ParentID"] = -1;
                        pDataTable.Rows.Add(pDataRow);

 

                       
                        //開始點選查詢
                        IMap pMap;
                        pMap = axMapControl1.Map as IMap;

                        //獲取點圖層
                        IFeatureLayer pFeatureLayer;
                        pFeatureLayer = pMap.get_Layer(i) as IFeatureLayer;
                        IFeatureClass pFeatureClass;
                        pFeatureClass = pFeatureLayer.FeatureClass;

                        //獲取鼠標點擊點
                        IPoint pPoint;
                        pPoint = new PointClass();
                        pPoint.PutCoords(e.mapX, e.mapY);

                        IGeometry pGeometry;

                        //定義緩沖區
                        double db = 2;
                        ITopologicalOperator pTop;
                        pTop = pPoint as ITopologicalOperator;
                        pGeometry = pTop.Buffer(db);

                        //選取
                        pMap.SelectByShape(pGeometry, null, false);
                        pMap.ClearSelection();

                        //空間過濾運算
                        ISpatialFilter pSpatialFilter = new SpatialFilterClass();
                        pSpatialFilter.Geometry = pGeometry;


                        //設置為不同的要素類型的圖層
                        switch (pFeatureClass.ShapeType)
                        {
                            case esriGeometryType.esriGeometryPoint:
                                pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
                                break;
                            case esriGeometryType.esriGeometryPolyline:
                                pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
                                break;
                            case esriGeometryType.esriGeometryPolygon:
                                pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                                break;

                        }
                        pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;

                        //指針
                        IFeatureCursor pFeatureCursor;
                        pFeatureCursor = pFeatureClass.Search(pSpatialFilter, false);
                        IFeature pFeature;
                        pFeature = pFeatureCursor.NextFeature();

                        //開始遍歷
                        while (pFeature != null)
                        {

                            //獲取要素的字段名和字段值
                            int n = pFeature.Fields.FieldCount; //這句話很重要,得到字段數目;
                            string sName;
                           // object oValue;
                            string sValue;
                          

                            //這句話的對象需要隨着地圖的改變而改變。可以是ID,FID 等帶有唯一標識身份的 東西。
                                int index=pFeature.Fields.FindField("ObjectID");
                                if (index == -1)
                                    return;
                                IField pField = pFeature.Fields.get_Field(index);
                                sName = pField.Name;
                              
                                sValue = pFeature.get_Value(index).ToString();
                               
                              
                                    pDataRow = pDataTable.NewRow();
                                   
                            //之所以這樣賦值是為了保證ID的唯一性;
                                    pDataRow["ID"] = lyrName + sValue;
                                    //賦值給ObjectID等的值,這樣是為了好合並表;
                                    pDataRow["Name"] = sValue;
                                    pDataRow["ParentID"] = lyrName;
                                    pDataTable.Rows.Add(pDataRow);


                                //}

                              

                            //}
                            pFeature = pFeatureCursor.NextFeature();

 

                        }
                    }
                   //   dataGridView1.DataSource = pDataTable;
                    treeList1.DataSource = pDataTable;
                    treeList1.ParentFieldName="ParentID";
                

                 
                }

            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM