转自chanyinhelv原文AE属性表操作

实现的操作包括:1、打开属性表;2、编辑属性表;3、增加属性列;4、数据排序;5、字段计算……

嗯,实现的功能目前就这些吧,后续还会继续跟进,还望大家多多关注……下面就分功能说说我的实现方式吧……

1、打开属性表

属性表的打开是在TOC的右键菜单中打开的,首先新建一个类OpenAttribute,继承BaseCommand,OpenAttribute类的源码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.Controls; namespace MapDemo
{
public sealed class OpenAttribute : BaseCommand
{
IMapControl3 m_mapControl;
AxMapControl _MapControl; public OpenAttribute(AxMapControl pMapControl)
{
base.m_caption = "查看属性表";
_MapControl = pMapControl;
} public override void OnClick()
{
formTable formtable = new formTable(_MapControl, m_mapControl);
formtable.Show(); } public override void OnCreate(object hook)
{
m_mapControl = (IMapControl3)hook;
}
}
}

解释一下,AxMapControl参数是为了后面属性表操作时刷新视图的。接着在toc右键事件中添加代码:

m_menuLayer.AddItem(new OpenAttribute(mapMain), -1, 2, false, esriCommandStyles.esriCommandStyleIconAndText);

如此这般,这般如此,我们期待的属性表就出现了,效果呢比较丑陋,莫怪莫怪……

属性表打开之后呢,大家就看到了有关属性表操作的一些功能了,不过呢,属性表的大开的工作还尚未完成。接下来呢,添加如下引用:

完了之后,定义一下变量:

    1. AxMapControl _MapControl;
    2. IMapControl3 m_mapControl;
    3. public DataTable dt2;
    4. ITableSort pTs;//处理排序
    5. bool up = true;
    6. int row_index = 0;
    7. int col_index = 0;
    8. public string strAddField = "";
    9. RowAndCol[] pRowAndCol = new RowAndCol[10000];
    10. int count = 0;

这个窗口的参数为:

public formTable(AxMapControl pMapControl,IMapControl3 pMapCtrl)
{
InitializeComponent();
_MapControl = pMapControl;
m_mapControl = pMapCtrl;
}

这样,下面就可以显示属性了,在form_load事件中写如下代码:

TableShow();

此处,调用了TableShow方法,TableShow的代码如下:

public void TableShow()
{
ILayer pLayer = (ILayer)m_mapControl.CustomProperty;
IFeatureLayer pFLayer = pLayer as IFeatureLayer;
IFeatureClass pFeatureClass = pFLayer.FeatureClass; if (pFeatureClass == null) return; DataTable dt = new DataTable();
DataColumn dc = null; for (int i = ; i < pFeatureClass.Fields.FieldCount; i++)
{ dc = new DataColumn(pFeatureClass.Fields.get_Field(i).Name); dt.Columns.Add(dc); } IFeatureCursor pFeatureCuror = pFeatureClass.Search(null, false);
IFeature pFeature = pFeatureCuror.NextFeature(); DataRow dr = null;
while (pFeature != null)
{
dr = dt.NewRow();
for (int j = ; j < pFeatureClass.Fields.FieldCount; j++)
{
if (pFeatureClass.FindField(pFeatureClass.ShapeFieldName) == j)
{ dr[j] = pFeatureClass.ShapeType.ToString();
}
else
{
dr[j] = pFeature.get_Value(j).ToString(); }
} dt.Rows.Add(dr);
pFeature = pFeatureCuror.NextFeature();
}
gdvAttribute.DataSource = dt;
dt2 = dt;
}

这样呢,属性表的显示就完成了。

2、新增字段

先看看那个“新增字段”按钮的事件吧……

ILayer pLayer = (ILayer)m_mapControl.CustomProperty;

IFeatureLayer pFLayer = pLayer as IFeatureLayer;

formAddField formaddfield = new formAddField(pFLayer, gdvAttribute);

formaddfield.Show();

此处,调用了窗体formAddField ,传递的参数是IFeatureLayer pFLayer 和DataGridView gdvAttribute,那么,下面看看formAddField的设计以及实现

界面呢也是比较简单,看看formAddField
的代码:

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; using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Controls; namespace MapDemo
{
public partial class formAddField : Form
{
private IFeatureLayer _FeatureLayer = null;
private DataGridView _dgv;
public formAddField(IFeatureLayer pFeatureLayer, DataGridView dgv)
{
InitializeComponent();
_FeatureLayer = pFeatureLayer;
_dgv = dgv;
} private void formAddField_Load(object sender, EventArgs e)
{
this.cmbFieldType.Items.Add("长整型");
this.cmbFieldType.Items.Add("短整型");
this.cmbFieldType.Items.Add("浮点型");
this.cmbFieldType.Items.Add("双精度");
this.cmbFieldType.Items.Add("文本型");
this.cmbFieldType.Items.Add("日期型");
this.cmbFieldType.SelectedIndex = ;
} /// <summary>
/// 改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cmbFieldType_SelectedIndexChanged(object sender, EventArgs e)
{
string strFieldType = cmbFieldType.Text;
switch (strFieldType)
{
case "长整型":
{
panelPrecision.Visible = true;
panelScale.Visible = false;
break;
}
case "短整型":
{
panelPrecision.Visible = true;
panelScale.Visible = false;
break;
}
case "浮点型":
{
panelPrecision.Visible = true;
panelScale.Visible = true;
break;
}
case "双精度":
{
panelPrecision.Visible = true;
panelScale.Visible = true;
break;
}
case "文本型":
{
panelPrecision.Visible = true;
panelScale.Visible = false;
lblPrecision.Text = "长度";
break;
}
default://日期型0
{
panelPrecision.Visible = false;
panelScale.Visible = false;
break;
}
}
} private void btnOK_Click(object sender, EventArgs e)
{
string strFieldName = txtFieldName.Text;
string strFieldType = cmbFieldType.Text;
try
{
IFeatureLayer editAttributeLayer = _FeatureLayer; //Field collection
IFieldsEdit pFieldsEdit;
//获取FeatureLayer
IFeatureLayer pFeatureLayer = editAttributeLayer; //从FeatureLayer获取工作空间
IDataset pDataSet = pFeatureLayer.FeatureClass as IDataset;
IWorkspace pWorkSpace = pDataSet.Workspace;
//设置字段属性
IField pNewField = new FieldClass();
IFieldEdit pFieldEdit = pNewField as IFieldEdit;
pFieldEdit.AliasName_2 = strFieldName;
pFieldEdit.Name_2 = strFieldName;
switch (strFieldType)
{
case "长整型":
{
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
pFieldEdit.Precision_2 = int.Parse(txtPrecision.Text);
break;
}
case "Class1.cs短整型":
{
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;
pFieldEdit.Precision_2 = int.Parse(txtPrecision.Text);
break;
}
case "浮点型":
{
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSingle;
pFieldEdit.Precision_2 = int.Parse(txtPrecision.Text);
pFieldEdit.Scale_2 = int.Parse(txtScale.Text);
break;
}
case "双精度":
{
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
pFieldEdit.Precision_2 = int.Parse(txtPrecision.Text);
pFieldEdit.Scale_2 = int.Parse(txtScale.Text);
break;
}
case "文本型":
{
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldEdit.Length_2 = int.Parse(txtPrecision.Text);
break;
}
default://日期型0
{
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate;
break;
}
}
//添加字段
try
{
int theField = pFeatureLayer.FeatureClass.Fields.FindField(strFieldName);
if (theField == -)
{
pFeatureLayer.FeatureClass.AddField(pFieldEdit);
MessageBox.Show("字段添加成功!");
}
else
{
MessageBox.Show("字段已经存在!");
}
}
catch (Exception ex)
{
MessageBox.Show("Field " + pFieldEdit.Name + " was not added due to an error (" + ex.Message + " )");
} }
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
this.Close();
RefreshTable refresh = new RefreshTable();
refresh.Refresh(_dgv, _FeatureLayer);
} private void btnCancle_Click(object sender, EventArgs e)
{
this.Close();
}
}
}

首先,在窗体加载的时候将数据类型添加进去,之后在类型选择改变时触发其属性控制控件的显示或者改变,接下来就是最重要的添加字段了,大家注意到了,在this.Close()之后,还调用了RefreshTable 的Refresh方法,传递的参数是datagridview _dgv和Ifeaturelayer _FeatureLayer,Refresh方法主要是实现添加自断后显示的刷新,由于后面还有涉及到,所以,这个后面一并说。

3、编辑属性并保存

还是先看看那两个按钮的时间吧:

private void toolEditor_Click(object sender, EventArgs e)
{
gdvAttribute.ReadOnly = false;
this.gdvAttribute.CurrentCell = this.gdvAttribute.Rows[this.gdvAttribute.Rows.Count - ].Cells[];
} /// <summary>
/// 保存编辑
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolSave_Click(object sender, EventArgs e)
{
gdvAttribute.ReadOnly = true;
ILayer pLayer = (ILayer)m_mapControl.CustomProperty;
IFeatureLayer pFLayer = pLayer as IFeatureLayer;
IFeatureClass pFeatureClass = pFLayer.FeatureClass;
ITable pTable;
//pTable = pFeatureClass.CreateFeature().Table;//很重要的一种获取shp表格的一种方式
pTable = pFLayer as ITable;
//将改变的记录值传给shp中的表
int i = ;
while (pRowAndCol[i].Column != || pRowAndCol[i].Row != )
{
IRow pRow;
pRow = pTable.GetRow(pRowAndCol[i].Row);
pRow.set_Value(pRowAndCol[i].Column, pRowAndCol[i].Value);
pRow.Store();
i++;
}
count = ;
for (int j = ; j < i; j++)
{
pRowAndCol[j].Row = ;
pRowAndCol[j].Column = ;
pRowAndCol[j].Value = null;
}
MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK);
}

在保存属性表的时候,出现了pRowAndCol,对他的定义如下:

public struct RowAndCol
{
//字段
private int row;
private int column;
private string _value; //行属性
public int Row
{
get
{
return row;
}
set
{
row = value;
}
}
//列属性
public int Column
{
get
{
return column;
}
set
{
column = value;
}
}
//值属性
public string Value
{
get
{
return _value;
}
set
{
_value = value;
}
}
}

4、删除选择

顾名思义,就是删除选择的行,这里的选择可以是多选,也可是单选,看看对应按钮的事件吧:

private void toolDelSelect_Click(object sender, EventArgs e)
{
if (((MessageBox.Show("确定要删除吗", "警告", MessageBoxButtons.YesNo)) == DialogResult.Yes))
{
ILayer pLayer = (ILayer)m_mapControl.CustomProperty;
IFeatureLayer pFLayer = pLayer as IFeatureLayer;
ITable pTable = pFLayer as ITable;
IRow pRow = pTable.GetRow(row_index);
pRow.Delete();
TableShow();
MessageBox.Show("删除成功!", "提示", MessageBoxButtons.OK);
_MapControl.ActiveView.Refresh();
}
}

此处,看看下面这个事件:

private void gdvAttribute_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
//记录值一旦改变触发此事件
//在dataGridView中获取改变记录的行数,列数和记录值
pRowAndCol[count].Row = gdvAttribute.CurrentCell.RowIndex;
pRowAndCol[count].Column = gdvAttribute.CurrentCell.ColumnIndex;
pRowAndCol[count].Value = gdvAttribute.Rows[gdvAttribute.CurrentCell.RowIndex].Cells[gdvAttribute.CurrentCell.ColumnIndex].Value.ToString();
count++;
}

5、导出Excel

首先得添加程序对Microsoft.Office.Interop.Excel的引用,添加完成之后方可导出:

private void toolExpXLS_Click(object sender, EventArgs e)
{
ILayer pLayer = (ILayer)m_mapControl.CustomProperty;
IFeatureLayer pFLayer = pLayer as IFeatureLayer;
IFeatureClass pFeatureClass = pFLayer.FeatureClass;
IFields pFields = pFeatureClass.Fields;
ExportExcel(gdvAttribute, pFields);
} private void ExportExcel(DataGridView myDGV, IFields pFields)
{
string saveFileName = "";
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xls";
saveDialog.Filter = "Excel文件|*.xls";
saveDialog.ShowDialog();
saveFileName = saveDialog.FileName;
if (saveFileName.IndexOf(":") < ) return; //被点了取消 Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
return;
} Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[];//取得sheet1 //写入标题
for (int i = ; i < myDGV.ColumnCount; i++)
{
worksheet.Columns.Cells[, i + ] = myDGV.Columns[i].HeaderText;
}
//写入数值
for (int r = ; r < myDGV.Rows.Count; r++)
{
for (int i = ; i < myDGV.ColumnCount; i++)
{
worksheet.Cells[r + , i + ] = myDGV.Rows[r].Cells[i].Value;
}
System.Windows.Forms.Application.DoEvents();
} worksheet.Columns.EntireColumn.AutoFit();//列宽自适应 if (saveFileName != "")
{
try
{
workbook.Saved = true;
workbook.SaveCopyAs(saveFileName);
}
catch (Exception ex)
{
MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
}
xlApp.Quit();
GC.Collect();//强行销毁
MessageBox.Show("资料保存成功", "提示", MessageBoxButtons.OK);
}
}

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

AE属性表操作的更多相关文章

  1. ArcMap属性表操作接口ITableWindow3

    ITableWindow3 tableWindow3 = new TableWindowClass                {                    //Layer = laye ...

  2. AE二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)

    /* * 实习课上讲进阶功能所用文档,因为赶时间从网上抄抄改改,凑合能用,记录一下以备个人后用. * * ----------------------------------------------- ...

  3. jquery:jqery表单属性 值操作

    重置表单(且清空隐藏域)  $('#myform')[0].reset() ​​ DOM属性相关操作 返回属性值 $(selector).attr(attribute) 设置属性值 $(selecto ...

  4. hibernate学习笔记(6)组件属性以及单表操作

    组件属性:实体类中的某个属性属于用户自定义类的对象: 作用:将两个实体类合并在一起组建成一个表 在hbm.xml文件中配置: 格式: <component name="取的名字&quo ...

  5. MySQL数据分析-(12)表操作补充:字段属性

    大家好,我是jacky朱元禄,很高兴继续跟大家学习MySQL数据分析实战,今天我们分享的主题是表操作补充之字段属性,依照惯例第一部分,jacky先跟大家分享本课时的学习逻辑 (一)学习逻辑 我们说创建 ...

  6. Microsoft Visual Studio 工程属性表props/vsprops创建与使用

    props/vsprops:工程属性表文件(project property sheet) 后者为vs2008的,前者为vs2010及以后版本的,其主要包含工程属性配置相关,可以单独提取出来供不同工程 ...

  7. Sql Server系列:数据表操作

    表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...

  8. SQL server基础知识(表操作、数据约束、多表链接查询)

    SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...

  9. delphi 注册表操作(读取、添加、删除、修改)完全手册

    DELPHI VS PASCAL(87)  32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创建和释放TRegistry对象 1.创建TRegistry对象.为了操 ...

随机推荐

  1. CISP/CISA 每日一题 17

     CISSP 每日一题(答) What are often added to passwords to maketheir resultant hash secure and resistant to ...

  2. StartCoroutine的使用

    StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,可是在unity中有些元素是不能操作的.这个时候能够使用协程来完毕. 使 ...

  3. 【MongoDB】The connection between two tables

    In mongoDB, there are two general way to connect with two tables. Manual Connection and use DBRef 1. ...

  4. 发送 email 过程

    发送 email 过程 SMTP基本命令集: 命令 描述 ---------- HELO 向服务器标识用户身份发送者能欺骗,说谎,但一般情况下服务器都能检测到. MAIL 初始化邮件传输 mail f ...

  5. vue使用jsonp

    axios不支持jsonp,所以需使用其他插件:vue-jsonp npm i vue-jsonp -S 然后在 src/main.js : import Vue from 'vue' import ...

  6. 画pcb时丝印不能再焊盘上

    上图中U3就在焊盘上,这样印出来U3显示不全

  7. CentOS下利用Docker部署Surging

    原文:CentOS下利用Docker部署Surging 1. 安装Centos, 配置固定ip配置文件地址vi /etc/sysconfig/network-scripts/ifcfg-ens33`` ...

  8. Can't bind to 'formGroup' since it isn't a known property of 'form'

    在APP.module.ts中引入FormsModule, ReactiveFormsModule. import { BrowserModule } from '@angular/platform- ...

  9. POJ3984 迷宫问题 BFS

    看题传送门:http://poj.org/problem?id=3984 BFS水一发 明天帮学弟挑电脑顺便去玩.接下来几天好好看数据结构.嗯哼. 这题标准的BFS应用,唯一需要注意的是需要输出中间的 ...

  10. 七步从AngularJS菜鸟到专家(7):Routing

    这是"AngularJS – 七步从菜鸟到专家"系列的第七篇. 在第一篇,我们展示了如何開始搭建一个AngularaJS应用.在第四.五篇我们讨论了Angular内建的directives.上一篇了解 ...