ILayer player; public OpenPropetryDialog(ILayer layer) { this.player = layer; } public DataTable FillTable( string tableName) { DataTable datable = CreateTable(player, tableName); ITable pTable = player as ITable; string shape = GetShapeType(player); ICursor pCursor = pTable.Search(null, false); IRow pRow = pCursor.NextRow(); while (pRow !=null ) { DataRow dataRow = datable.NewRow() ; for (int i = 0; i < pRow .Fields .FieldCount ; i++) { if (pRow .Fields .get_Field (i).Type ==esriFieldType .esriFieldTypeGeometry ) { dataRow[i] = shape; } else if (pRow.Fields.get_Field(i).Type == esriFieldType.esriFieldTypeBlob) { dataRow[i] = "element"; } else { dataRow[i] = pRow.get_Value(i); } } datable.Rows.Add(dataRow); if (datable.Rows.Count > 200) { break; } else { pRow = pCursor.NextRow();//Pcursor先当于链表中移动的那个针,生成是头指针; } } return datable; } private string GetShapeType(ILayer pLayer) { IFeatureLayer pFeatureLayer = player as IFeatureLayer; switch (pFeatureLayer .FeatureClass .ShapeType ) { case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint: return "Point"; case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon: return "Polygon"; case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline: return "Polyline"; default: return "UNkonw"; } } private DataTable CreateTable(ILayer pLayer, string taleName) { DataTable datatable = new DataTable(taleName); ITable pTable = pLayer as ITable; DataColumn dataColum; for (int i = 0; i < pTable.Fields.FieldCount; i++) { IField pField = pTable.Fields.get_Field(i); dataColum = new DataColumn(pField.Name); if (pField.Name == pTable.OIDFieldName) { dataColum.Unique = true; } dataColum.AllowDBNull = pField.IsNullable; dataColum.Caption = pField.AliasName; dataColum.DataType = System.Type.GetType(ParseFieldType(pField.Type)); dataColum.DefaultValue = pField.DefaultValue; if (pField.VarType == 8) { dataColum.MaxLength = pField.Length; } datatable.Columns.Add(dataColum); } return datatable; } private string ParseFieldType(esriFieldType esriFieldType)//由于ersi中得类型和。net中的类型不一样,所以需要转化 { switch (esriFieldType) { case esriFieldType.esriFieldTypeBlob: return "System.String"; case esriFieldType.esriFieldTypeDate: return "System.DateTime"; case esriFieldType.esriFieldTypeDouble: return "System.Double"; case esriFieldType.esriFieldTypeGUID: return "System.String"; case esriFieldType.esriFieldTypeGeometry: return "System.String"; case esriFieldType.esriFieldTypeGlobalID: return "System.String"; case esriFieldType.esriFieldTypeInteger: return "System.Int32"; case esriFieldType.esriFieldTypeOID: return "System.Int32"; case esriFieldType.esriFieldTypeSingle: return "System.Single"; case esriFieldType.esriFieldTypeSmallInteger: return "System.Int32"; case esriFieldType.esriFieldTypeString: return "System.String"; default: return ""; } } 上面的类封装了一个创建数据列表的类。 private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)//使用cellClick方法而不是cellcontentClick方法 { if (e.RowIndex !=-1) { IFeature pFeature; try { int ID = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[0].Value); pFeature=(layer as IFeatureLayer).FeatureClass .GetFeature(ID); } catch (Exception) { pFeature = null; } if (pFeature !=null) { if (pFeature .Shape .GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint ) { this.axMapControl.CenterAt((IPoint)pFeature.Shape); } else { IEnvelope pEnve = pFeature.Shape.Envelope; pEnve.Expand(5, 5, true);//包络线的的xy远离; this.axMapControl.ActiveView.Extent = pEnve;//activVIEW屏幕为视图 } } this.axMapControl.Refresh(); this.axMapControl.ActiveView.ScreenDisplay.UpdateWindow(); switch (pFeature .Shape .GeometryType ) { case esriGeometryType.esriGeometryPoint: break; case esriGeometryType.esriGeometryPolygon: this.axMapControl.FlashShape(((pFeature.Shape) as IGeometry), 3, 300, Type.Missing); break; case esriGeometryType.esriGeometryPolyline: default: break; } } }