转自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. 使用C#对XML进行增删改查操作

    xml文件格式 <?xml version="1.0" encoding="utf-8"?> <messageList> <mes ...

  2. CISP/CISA 每日一题 22

    CISSP 每日一题(答)What should be done to verify patcheshave been applied? Auditpatches, or use a vulnerab ...

  3. 【2017 Multi-University Training Contest - Team 7】Just do it

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6129 [Description] 设定b[i]=a[1]^a[2]^a[3]^------a[i] ...

  4. Hadoop学习总结(2)——Hadoop入门详解

    1.Hadoop介绍 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了一个系统底层细节透明的分布式架构,通过Hadoop,可以将大量的廉价机器的计算资源组织起来,解决单机 ...

  5. hibernate中的事务管理是怎么概念?

    1.JDBC事务 JDBC 事务是用 Connection 对象控制的.JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交. ja ...

  6. 洛谷 P2026 求一次函数解析式

    P2026 求一次函数解析式 题目背景 做数学寒假作业的怨念…… 题目描述 给定两个整点的坐标,求它们所在直线的函数解析式(一次函数). 输入输出格式 输入格式: 输入共两行. 第一行有两个整数x1, ...

  7. java和javascript日期校验和闰年问题分析和解决方式

    1.闰年的介绍 地球绕太阳执行周期为365天5小时48分46秒(合365.24219天)即一回归年.公历的平年仅仅有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天.故四年于2月加 ...

  8. c3p0的经常使用配置方式

    1:第一种方式很easy c3p0.driverClass=com.mysql.jdbc.Driver c3p0.jdbcUrl=jdbc:mysql://localhost:3308/databas ...

  9. 20款PHP版WebMail开源项目

    20款PHP版WebMail开源项目 如今互联网巨头提供的企业应用套件中邮件托管是必备服务,而且还始终秉承免费的优良光荣传统,最为让人熟识的恐怕非"瘟多死里屋管理中心"和" ...

  10. Android学习笔记之网络接口(Http接口,Apache接口,Android接口)

    目前Android平台有三种网络接口可以使用,他们分别是:Java.NET.*(标准Java接口),org.apache(Apache接口),和android.Net.*(android网络接口). ...