请教 C#ArcEngine二次开发引入类似ArcMap对属性表内容操作的方法
通过其他博主的帮助,已经实现了属性表的生成
但是想要增加类似ArcMap对属性表内容的操作,比如缩放至所选项、增删改查等操作。最好可以基于下列代码进行功能添加
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AutoPolyLine
{
public partial class AttributeTable : Form
{
ILayer mLayer; //**
private IFeatureLayer currentFeatureLayer;
public IFeatureLayer CurrentFeatureLayer
{
get { return currentFeatureLayer; }
set { currentFeatureLayer = value; }
}
//获取主窗体传入的地图
private IMap currentMap;
public IMap CurrentMap
{
get { return currentMap; }
set { currentMap = value; }
}
public AttributeTable(ILayer pLayerT) //**
{
InitializeComponent();
mLayer = pLayerT; //**
OpenAttributeTable();
}
private void AttributeTable_Load(object sender, EventArgs e)
{
OpenAttributeTable(); //自定义方法
}
public void OpenAttributeTable()
{
IFeatureLayer pFeatureLayer = mLayer as IFeatureLayer; //**
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; //** using ESRI.ArcGIS.Geodatabase;
DataTable dt = new DataTable();
if (pFeatureClass != null)
{
DataColumn dc;
for (int i = 0; i < pFeatureClass.Fields.FieldCount; i++)
{
dc = new DataColumn(pFeatureClass.Fields.get_Field(i).Name);
dt.Columns.Add(dc);//获取所有列的属性值
}
IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
IFeature pFeature = pFeatureCursor.NextFeature();
DataRow dr;
while (pFeature != null)
{
dr = dt.NewRow();
for (int j = 0; j < pFeatureClass.Fields.FieldCount; j++)
{
//判断feature的形状
if (pFeature.Fields.get_Field(j).Name == "Shape")
{
if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)
{
dr[j] = "点";
}
if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)
{
dr[j] = "线";
}
if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
{
dr[j] = "面";
}
}
else
{
dr[j] = pFeature.get_Value(j).ToString();//增加行
}
}
dt.Rows.Add(dr);
pFeature = pFeatureCursor.NextFeature();
}
}
this.dataGridView1.DataSource = dt;
}
}
}
基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦、”(最新版更智能,功能更加强大)
为了实现缩放至所选项、增删改查等操作,您可以根据以下代码进行功能添加:
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AutoPolyLine
{
public partial class AttributeTable : Form
{
ILayer mLayer;
private IFeatureLayer currentFeatureLayer;
private IMap currentMap;
private IActiveView activeView;
private DataTable dataTable;
public IFeatureLayer CurrentFeatureLayer
{
get { return currentFeatureLayer; }
set { currentFeatureLayer = value; }
}
public IMap CurrentMap
{
get { return currentMap; }
set { currentMap = value; }
}
public AttributeTable(ILayer pLayerT, IMap pMap)
{
InitializeComponent();
mLayer = pLayerT;
currentMap = pMap;
activeView = currentMap as IActiveView;
OpenAttributeTable();
}
private void AttributeTable_Load(object sender, EventArgs e)
{
OpenAttributeTable();
}
public void OpenAttributeTable()
{
// ... 保留原有代码 ...
this.dataGridView1.DataSource= dt;
dataTable = dt;
}
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
ZoomToSelectedFeatures();
}
private void ZoomToSelectedFeatures()
{
DataGridViewSelectedRowCollection selectedRows = dataGridView1.SelectedRows;
if (selectedRows.Count > 0)
{
IFeatureLayer pFeatureLayer = mLayer as IFeatureLayer;
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IEnvelope envelope = new EnvelopeClass();
envelope.SetEmpty();
foreach (DataGridViewRow row in selectedRows)
{
int objectId = Convert.ToInt32(row.Cells["OBJECTID"].Value);
IFeature feature = pFeatureClass.GetFeature(objectId);
envelope.Union(feature.Shape.Envelope);
}
if (!envelope.IsEmpty)
{
envelope.Expand(1.2, 1.2, true);
activeView.Extent = envelope;
activeView.Refresh();
}
}
}
// 在此添加增删改查的相关操作方法
}
}
这段代码中,我添加了一个ZoomToSelectedFeatures方法,用于缩放至所选项。同时,我修改了AttributeTable构造函数,使其接收IMap参数,并在ZoomToSelectedFeatures方法中使用此参数进行缩放操作。
此外,您还可以根据需要添加增删改查的相关操作方法。在dataGridView1
的事件处理程序中调用这些方法,以便在用户与属性表交互时执行相应操作。
csharp
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
IFeature feature = GetSelectedFeature();
if (feature != null)
{
IEnvelope envelope = feature.Shape.Envelope;
envelope.Expand(1.2, 1.2, true);
IActiveView activeView = currentMap as IActiveView;
activeView.Extent = envelope;
activeView.Refresh();
}
}
}
private IFeature GetSelectedFeature()
{
int rowIndex = dataGridView1.SelectedRows[0].Index;
IFeature feature = null;
if (rowIndex >= 0 && rowIndex < currentFeatureLayer.FeatureClass.FeatureCount(null))
{
IFeatureCursor featureCursor = currentFeatureLayer.Search(null, false);
featureCursor.Skip(rowIndex);
feature = featureCursor.NextFeature();
}
return feature;
}
csharp
private void btnAddRow_Click(object sender, EventArgs e)
{
IFeatureClass featureClass = currentFeatureLayer.FeatureClass;
IFeature feature = featureClass.CreateFeature();
for (int i = 0; i < featureClass.Fields.FieldCount; i++)
{
if (featureClass.Fields.get_Field(i).Editable)
{
feature.set_Value(i, "");
}
}
feature.Store();
OpenAttributeTable();
}
csharp
private void btnDeleteRow_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
int rowIndex = dataGridView1.SelectedRows[0].Index;
IFeature feature = GetSelectedFeature();
if (feature != null)
{
IFeatureClass featureClass = currentFeatureLayer.FeatureClass;
featureClass.DeleteFeature(feature.OID);
OpenAttributeTable();
}
}
}
csharp
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
{
IFeature feature = GetSelectedFeature();
if (feature != null)
{
feature.set_Value(e.ColumnIndex, dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
feature.Store();
}
}
}
如果你想用代码来添加、删除或修改字段,你可以使用ArcPy模块,它是ArcGIS的Python接口。根据搜索结果1,你可以按照以下步骤用代码来操作字段:
导入arcpy模块,例如 import arcpy
指定要操作的表或要素类的路径,例如 table = r"C:\data\test.gdb\test_table"
要添加新字段,使用 arcpy.AddField_management 函数,指定字段名称、数据类型和其他属性,例如 arcpy.AddField_management(table, "A", "LONG", alias="Field A")
要删除字段,使用 arcpy.DeleteField_management 函数,指定要删除的字段名称,例如 arcpy.DeleteField_management(table, "B")
要修改字段属性,如名称、数据类型、别名等,使用 arcpy.AlterField_management 函数,指定要修改的字段名称和新的属性值,例如 arcpy.AlterField_management(table, "C", new_field_name="D", new_field_alias="Field D")
注意:要进行这些操作,你需要具有对数据的写入权限,并且当前未在 ArcMap 中编辑数据。另外,不同的数据源可能有不同的字段命名原则和限制。你可以参考这篇文档2了解更多细节。