C#ArcEngine二次开发引入类似Arcmap内属性表内容的操作

请教 C#ArcEngine二次开发引入类似ArcMap对属性表内容操作的方法
通过其他博主的帮助,已经实现了属性表的生成

img

但是想要增加类似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的事件处理程序中调用这些方法,以便在用户与属性表交互时执行相应操作。

该回答引用ChatGPT
要实现类似ArcMap对属性表内容的操作,可以在AttributeTable类中添加相应的方法。以下是一些常见的操作及其实现方法:
1. 缩放至所选项
在DataGridView中选中某一行时,可以通过获取该行对应的Feature的Geometry,然后调用IMap接口的ZoomTo方法实现缩放至该Feature。
具体实现方法如下:
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;
}

2. 增加行
在DataGridView中添加一行时,可以通过IFeatureClass接口的CreateFeature方法创建一个新的Feature,并将其添加到FeatureClass中。
具体实现方法如下:
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();
}

3. 删除行
在DataGridView中删除一行时,可以通过IFeatureClass接口的DeleteFeature方法删除对应的Feature。
具体实现方法如下:
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();
}
}
}

4. 修改行
在DataGridView中修改一行时,可以通过IFeature接口的set_Value方法修改对应的Feature的属性值。
具体实现方法如下:
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();
}
}
}

通过以上方法的实现,即可在AttributeTable中实现类似ArcMap对属性表内容的操作。

如果你想用代码来添加、删除或修改字段,你可以使用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了解更多细节。