AE属性表操作

 

原文连接:http://blog.csdn.net/lysc_forever/article/details/17093405


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

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

1、打开属性表

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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using ESRI.ArcGIS.ADF.BaseClasses;  
  5. using ESRI.ArcGIS.Controls;  
  6.   
  7. namespace MapDemo  
  8. {  
  9.     public sealed class OpenAttribute : BaseCommand  
  10.     {  
  11.         IMapControl3 m_mapControl;  
  12.         AxMapControl _MapControl;  
  13.   
  14.         public OpenAttribute(AxMapControl pMapControl)  
  15.         {  
  16.             base.m_caption = "查看属性表";  
  17.             _MapControl = pMapControl;  
  18.         }  
  19.   
  20.         public override void OnClick()  
  21.         {  
  22.             formTable formtable = new formTable(_MapControl, m_mapControl);  
  23.             formtable.Show();  
  24.   
  25.         }  
  26.   
  27.         public override void OnCreate(object hook)  
  28.         {  
  29.             m_mapControl = (IMapControl3)hook;  
  30.         }  
  31.     }  
  32. }  


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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //查看属性表  
  2.             m_menuLayer.AddItem(new OpenAttribute(mapMain), -1, 2, false, esriCommandStyles.esriCommandStyleIconAndText);  


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


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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. using ESRI.ArcGIS.Carto;  
  2. using ESRI.ArcGIS.Controls;  
  3. using ESRI.ArcGIS.Geodatabase;  


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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  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;  


这个窗口的参数为:

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ublic formTable(AxMapControl pMapControl,IMapControl3 pMapCtrl)  
  2.         {  
  3.             InitializeComponent();  
  4.             _MapControl = pMapControl;  
  5.             m_mapControl = pMapCtrl;  
  6.         }  


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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private void formTable_Load(object sender, EventArgs e)  
  2.         {  
  3.             TableShow();  
  4.         }  


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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void TableShow()  
  2.         {  
  3.             ILayer pLayer = (ILayer)m_mapControl.CustomProperty;  
  4.             IFeatureLayer pFLayer = pLayer as IFeatureLayer;  
  5.             IFeatureClass pFeatureClass = pFLayer.FeatureClass;  
  6.   
  7.             if (pFeatureClass == nullreturn;  
  8.   
  9.             DataTable dt = new DataTable();  
  10.             DataColumn dc = null;  
  11.   
  12.             for (int i = 0; i < pFeatureClass.Fields.FieldCount; i++)  
  13.             {  
  14.   
  15.                 dc = new DataColumn(pFeatureClass.Fields.get_Field(i).Name);  
  16.   
  17.                 dt.Columns.Add(dc);  
  18.   
  19.             }  
  20.   
  21.             IFeatureCursor pFeatureCuror = pFeatureClass.Search(nullfalse);  
  22.             IFeature pFeature = pFeatureCuror.NextFeature();  
  23.   
  24.             DataRow dr = null;  
  25.             while (pFeature != null)  
  26.             {  
  27.                 dr = dt.NewRow();  
  28.                 for (int j = 0; j < pFeatureClass.Fields.FieldCount; j++)  
  29.                 {  
  30.                     if (pFeatureClass.FindField(pFeatureClass.ShapeFieldName) == j)  
  31.                     {  
  32.   
  33.                         dr[j] = pFeatureClass.ShapeType.ToString();  
  34.                     }  
  35.                     else  
  36.                     {  
  37.                         dr[j] = pFeature.get_Value(j).ToString();  
  38.   
  39.                     }  
  40.                 }  
  41.   
  42.                 dt.Rows.Add(dr);  
  43.                 pFeature = pFeatureCuror.NextFeature();  
  44.             }  
  45.             gdvAttribute.DataSource = dt;  
  46.             dt2 = dt;  
  47.         }  


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

2、新增字段

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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ILayer pLayer = (ILayer)m_mapControl.CustomProperty;  
  2.             IFeatureLayer pFLayer = pLayer as IFeatureLayer;  
  3.             formAddField formaddfield = new formAddField(pFLayer, gdvAttribute);  
  4.             formaddfield.Show();  


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


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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9.   
  10. using ESRI.ArcGIS.Carto;  
  11. using ESRI.ArcGIS.Geodatabase;  
  12. using ESRI.ArcGIS.Controls;  
  13.   
  14. namespace MapDemo  
  15. {  
  16.     public partial class formAddField : Form  
  17.     {  
  18.         private IFeatureLayer _FeatureLayer = null;  
  19.         private DataGridView _dgv;  
  20.         public formAddField(IFeatureLayer pFeatureLayer, DataGridView dgv)  
  21.         {  
  22.             InitializeComponent();  
  23.             _FeatureLayer = pFeatureLayer;  
  24.             _dgv = dgv;  
  25.         }  
  26.   
  27.         private void formAddField_Load(object sender, EventArgs e)  
  28.         {  
  29.             this.cmbFieldType.Items.Add("长整型");  
  30.             this.cmbFieldType.Items.Add("短整型");  
  31.             this.cmbFieldType.Items.Add("浮点型");  
  32.             this.cmbFieldType.Items.Add("双精度");  
  33.             this.cmbFieldType.Items.Add("文本型");  
  34.             this.cmbFieldType.Items.Add("日期型");  
  35.             this.cmbFieldType.SelectedIndex = 0;  
  36.         }  
  37.   
  38.         /// <summary>  
  39.         /// 改变事件  
  40.         /// </summary>  
  41.         /// <param name="sender"></param>  
  42.         /// <param name="e"></param>  
  43.         private void cmbFieldType_SelectedIndexChanged(object sender, EventArgs e)  
  44.         {  
  45.             string strFieldType = cmbFieldType.Text;  
  46.             switch (strFieldType)  
  47.             {  
  48.                 case "长整型":  
  49.                     {  
  50.                         panelPrecision.Visible = true;  
  51.                         panelScale.Visible = false;  
  52.                         break;  
  53.                     }  
  54.                 case "短整型":  
  55.                     {  
  56.                         panelPrecision.Visible = true;  
  57.                         panelScale.Visible = false;  
  58.                         break;  
  59.                     }  
  60.                 case "浮点型":  
  61.                     {  
  62.                         panelPrecision.Visible = true;  
  63.                         panelScale.Visible = true;  
  64.                         break;  
  65.                     }  
  66.                 case "双精度":  
  67.                     {  
  68.                         panelPrecision.Visible = true;  
  69.                         panelScale.Visible = true;  
  70.                         break;  
  71.                     }  
  72.                 case "文本型":  
  73.                     {  
  74.                         panelPrecision.Visible = true;  
  75.                         panelScale.Visible = false;  
  76.                         lblPrecision.Text = "长度";  
  77.                         break;  
  78.                     }  
  79.                 default://日期型0  
  80.                     {  
  81.                         panelPrecision.Visible = false;  
  82.                         panelScale.Visible = false;  
  83.                         break;  
  84.                     }  
  85.             }   
  86.         }  
  87.   
  88.         private void btnOK_Click(object sender, EventArgs e)  
  89.         {  
  90.             string strFieldName = txtFieldName.Text;  
  91.             string strFieldType = cmbFieldType.Text;  
  92.             try  
  93.             {  
  94.                 IFeatureLayer editAttributeLayer = _FeatureLayer;  
  95.   
  96.                 //Field collection  
  97.                 IFieldsEdit pFieldsEdit;  
  98.                 //获取FeatureLayer  
  99.                 IFeatureLayer pFeatureLayer = editAttributeLayer;  
  100.   
  101.                 //从FeatureLayer获取工作空间  
  102.                 IDataset pDataSet = pFeatureLayer.FeatureClass as IDataset;  
  103.                 IWorkspace pWorkSpace = pDataSet.Workspace;  
  104.                 //设置字段属性  
  105.                 IField pNewField = new FieldClass();  
  106.                 IFieldEdit pFieldEdit = pNewField as IFieldEdit;  
  107.                 pFieldEdit.AliasName_2 = strFieldName;  
  108.                 pFieldEdit.Name_2 = strFieldName;  
  109.                 switch (strFieldType)  
  110.                 {  
  111.                     case "长整型":  
  112.                     {  
  113.                         pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;  
  114.                         pFieldEdit.Precision_2 = int.Parse(txtPrecision.Text);  
  115.                         break;  
  116.                     }  
  117.                     case "Class1.cs短整型":  
  118.                     {  
  119.                         pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;  
  120.                         pFieldEdit.Precision_2 = int.Parse(txtPrecision.Text);  
  121.                         break;  
  122.                     }  
  123.                     case "浮点型":  
  124.                     {  
  125.                         pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSingle;  
  126.                         pFieldEdit.Precision_2 = int.Parse(txtPrecision.Text);  
  127.                         pFieldEdit.Scale_2 = int.Parse(txtScale.Text);  
  128.                         break;  
  129.                     }  
  130.                     case "双精度":  
  131.                     {  
  132.                         pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;  
  133.                         pFieldEdit.Precision_2 = int.Parse(txtPrecision.Text);  
  134.                         pFieldEdit.Scale_2 = int.Parse(txtScale.Text);  
  135.                         break;  
  136.                     }  
  137.                     case "文本型":  
  138.                     {  
  139.                         pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;  
  140.                         pFieldEdit.Length_2 = int.Parse(txtPrecision.Text);  
  141.                         break;  
  142.                     }  
  143.                     default://日期型0  
  144.                     {  
  145.                         pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate;  
  146.                         break;  
  147.                     }  
  148.                 }                 
  149.                 //添加字段  
  150.                 try  
  151.                 {  
  152.                     int theField = pFeatureLayer.FeatureClass.Fields.FindField(strFieldName);  
  153.                     if (theField == -1)  
  154.                     {  
  155.                         pFeatureLayer.FeatureClass.AddField(pFieldEdit);  
  156.                         MessageBox.Show("字段添加成功!");  
  157.                     }  
  158.                     else  
  159.                     {  
  160.                         MessageBox.Show("字段已经存在!");  
  161.                     }  
  162.                 }  
  163.                 catch (Exception ex)  
  164.                 {  
  165.                     MessageBox.Show("Field " + pFieldEdit.Name + " was not added due to an error (" + ex.Message + " )");  
  166.                 }  
  167.   
  168.             }  
  169.             catch (System.Exception ex)  
  170.             {  
  171.                 MessageBox.Show(ex.Message);  
  172.             }              
  173.             this.Close();  
  174.             RefreshTable refresh = new RefreshTable();  
  175.             refresh.Refresh(_dgv, _FeatureLayer);  
  176.         }  
  177.   
  178.         private void btnCancle_Click(object sender, EventArgs e)  
  179.         {  
  180.             this.Close();  
  181.         }          
  182.     }  
  183. }  


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

3、编辑属性并保存

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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2.         /// 编辑属性,并定位到最后一行  
  3.         /// </summary>  
  4.         /// <param name="sender"></param>  
  5.         /// <param name="e"></param>  
  6.         private void toolEditor_Click(object sender, EventArgs e)  
  7.         {  
  8.             gdvAttribute.ReadOnly = false;  
  9.             this.gdvAttribute.CurrentCell = this.gdvAttribute.Rows[this.gdvAttribute.Rows.Count - 2].Cells[0];  
  10.         }  
  11.   
  12.  /// <summary>  
  13.         /// 保存编辑  
  14.         /// </summary>  
  15.         /// <param name="sender"></param>  
  16.         /// <param name="e"></param>  
  17.         private void toolSave_Click(object sender, EventArgs e)  
  18.         {  
  19.             gdvAttribute.ReadOnly = true;  
  20.             ILayer pLayer = (ILayer)m_mapControl.CustomProperty;  
  21.             IFeatureLayer pFLayer = pLayer as IFeatureLayer;  
  22.             IFeatureClass pFeatureClass = pFLayer.FeatureClass;  
  23.             ITable pTable;  
  24.             //pTable = pFeatureClass.CreateFeature().Table;//很重要的一种获取shp表格的一种方式           
  25.             pTable = pFLayer as ITable;  
  26.             //将改变的记录值传给shp中的表  
  27.             int i = 0;  
  28.             while (pRowAndCol[i].Column != 0 || pRowAndCol[i].Row != 0)  
  29.             {  
  30.                 IRow pRow;  
  31.                 pRow = pTable.GetRow(pRowAndCol[i].Row);  
  32.                 pRow.set_Value(pRowAndCol[i].Column, pRowAndCol[i].Value);  
  33.                 pRow.Store();  
  34.                 i++;  
  35.             }  
  36.             count = 0;  
  37.             for (int j = 0; j < i; j++)  
  38.             {  
  39.                 pRowAndCol[j].Row = 0;  
  40.                 pRowAndCol[j].Column = 0;  
  41.                 pRowAndCol[j].Value = null;  
  42.             }  
  43.             MessageBox.Show("保存成功!""提示", MessageBoxButtons.OK);  
  44.         }  


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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public struct RowAndCol  
  2.         {  
  3.             //字段  
  4.             private int row;  
  5.             private int column;  
  6.             private string _value;  
  7.   
  8.             //行属性  
  9.             public int Row  
  10.             {  
  11.                 get  
  12.                 {  
  13.                     return row;  
  14.                 }  
  15.                 set  
  16.                 {  
  17.                     row = value;  
  18.                 }  
  19.             }  
  20.             //列属性  
  21.             public int Column  
  22.             {  
  23.                 get  
  24.                 {  
  25.                     return column;  
  26.                 }  
  27.                 set  
  28.                 {  
  29.                     column = value;  
  30.                 }  
  31.             }  
  32.             //值属性  
  33.             public string Value  
  34.             {  
  35.                 get  
  36.                 {  
  37.                     return _value;  
  38.                 }  
  39.                 set  
  40.                 {  
  41.                     _value = value;  
  42.                 }  
  43.             }  
  44.         }  


4、删除选择

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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2.         /// 删除行  
  3.         /// </summary>  
  4.         /// <param name="sender"></param>  
  5.         /// <param name="e"></param>  
  6.         private void toolDelSelect_Click(object sender, EventArgs e)  
  7.         {  
  8.             if (((MessageBox.Show("确定要删除吗""警告", MessageBoxButtons.YesNo)) == DialogResult.Yes))  
  9.             {  
  10.                 ILayer pLayer = (ILayer)m_mapControl.CustomProperty;  
  11.                 IFeatureLayer pFLayer = pLayer as IFeatureLayer;  
  12.                 ITable pTable = pFLayer as ITable;  
  13.                 IRow pRow = pTable.GetRow(row_index);  
  14.                 pRow.Delete();  
  15.                 TableShow();  
  16.                 MessageBox.Show("删除成功!""提示", MessageBoxButtons.OK);  
  17.                 _MapControl.ActiveView.Refresh();  
  18.             }  
  19.         }  


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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private void gdvAttribute_CellValueChanged(object sender, DataGridViewCellEventArgs e)  
  2.         {  
  3.             //记录值一旦改变触发此事件  
  4.             //在dataGridView中获取改变记录的行数,列数和记录值  
  5.             pRowAndCol[count].Row = gdvAttribute.CurrentCell.RowIndex;  
  6.             pRowAndCol[count].Column = gdvAttribute.CurrentCell.ColumnIndex;  
  7.             pRowAndCol[count].Value = gdvAttribute.Rows[gdvAttribute.CurrentCell.RowIndex].Cells[gdvAttribute.CurrentCell.ColumnIndex].Value.ToString();  
  8.             count++;  
  9.         }  


5、导出Excel

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

 

[csharp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2.         /// 导出Excel  
  3.         /// </summary>  
  4.         /// <param name="sender"></param>  
  5.         /// <param name="e"></param>  
  6.         private void toolExpXLS_Click(object sender, EventArgs e)  
  7.         {  
  8.             ILayer pLayer = (ILayer)m_mapControl.CustomProperty;  
  9.             IFeatureLayer pFLayer = pLayer as IFeatureLayer;  
  10.             IFeatureClass pFeatureClass = pFLayer.FeatureClass;  
  11.             IFields pFields = pFeatureClass.Fields;  
  12.             ExportExcel(gdvAttribute, pFields);  
  13.         }  
  14.   
  15.         private void ExportExcel(DataGridView myDGV, IFields pFields)  
  16.         {  
  17.             string saveFileName = "";  
  18.             SaveFileDialog saveDialog = new SaveFileDialog();  
  19.             saveDialog.DefaultExt = "xls";  
  20.             saveDialog.Filter = "Excel文件|*.xls";  
  21.             saveDialog.ShowDialog();  
  22.             saveFileName = saveDialog.FileName;  
  23.             if (saveFileName.IndexOf(":") < 0) return//被点了取消   
  24.   
  25.             Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();  
  26.             if (xlApp == null)  
  27.             {  
  28.                 MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");  
  29.                 return;  
  30.             }  
  31.   
  32.             Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;  
  33.             Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);  
  34.             Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1  
  35.   
  36.             //写入标题  
  37.             for (int i = 0; i < myDGV.ColumnCount; i++)  
  38.             {  
  39.                 worksheet.Columns.Cells[1, i + 1] = myDGV.Columns[i].HeaderText;  
  40.             }  
  41.             //写入数值  
  42.             for (int r = 0; r < myDGV.Rows.Count; r++)  
  43.             {  
  44.                 for (int i = 0; i < myDGV.ColumnCount; i++)  
  45.                 {  
  46.                     worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r].Cells[i].Value;  
  47.                 }  
  48.                 System.Windows.Forms.Application.DoEvents();  
  49.             }  
  50.   
  51.             worksheet.Columns.EntireColumn.AutoFit();//列宽自适应  
  52.   
  53.             if (saveFileName != "")  
  54.             {  
  55.                 try  
  56.                 {  
  57.                     workbook.Saved = true;  
  58.                     workbook.SaveCopyAs(saveFileName);  
  59.                 }  
  60.                 catch (Exception ex)  
  61.                 {  
  62.                     MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);  
  63.                 }  
  64.                 xlApp.Quit();  
  65.                 GC.Collect();//强行销毁   
  66.                 MessageBox.Show("资料保存成功""提示", MessageBoxButtons.OK);  
  67.             }  
  68.         }  



 

  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值