GIS二次开发实验指导书8Word文档下载推荐.docx

上传人:b****5 文档编号:18673973 上传时间:2022-12-31 格式:DOCX 页数:14 大小:343.58KB
下载 相关 举报
GIS二次开发实验指导书8Word文档下载推荐.docx_第1页
第1页 / 共14页
GIS二次开发实验指导书8Word文档下载推荐.docx_第2页
第2页 / 共14页
GIS二次开发实验指导书8Word文档下载推荐.docx_第3页
第3页 / 共14页
GIS二次开发实验指导书8Word文档下载推荐.docx_第4页
第4页 / 共14页
GIS二次开发实验指导书8Word文档下载推荐.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

GIS二次开发实验指导书8Word文档下载推荐.docx

《GIS二次开发实验指导书8Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《GIS二次开发实验指导书8Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。

GIS二次开发实验指导书8Word文档下载推荐.docx

InitializeComponent();

objDataTable=pDataTable;

objMapControl=pMapControl;

objLayer=pLayer;

}

3、项目中添加新的类,命名为ClassOpenAttributeTable。

4、在ClassOpenAttributeTable类中建立构造函数。

publicClassOpenAttributeTable()

5、在ClassOpenAttributeTable类中建立自定义方法CreateDataTableByLayer。

publicDataTableCreateDataTableByLayer(ILayerpLayer,stringtableName)

//创建一个DataTable表

DataTablepDataTable=newDataTable(tableName);

//取得ITable接口

ITablepTable=pLayerasITable;

IFieldpField=null;

DataColumnpDataColumn;

//System.Data.DataTable中列

//根据每个字段的属性建立DataColumn对象

for(inti=0;

i<

pTable.Fields.FieldCount;

i++)

pField=pTable.Fields.get_Field(i);

//新建一个DataColumn并设置其属性

pDataColumn=newDataColumn(pField.Name);

if(pField.Name==pTable.OIDFieldName)//此列的每行须唯一

pDataColumn.Unique=true;

//字段值是否唯一

//字段值是否允许为空

pDataColumn.AllowDBNull=pField.IsNullable;

//字段别名

pDataColumn.Caption=pField.AliasName;

//字段数据类型

pDataColumn.DataType=System.Type.GetType(ParseFieldType(pField.Type));

//字段默认值

pDataColumn.DefaultValue=pField.DefaultValue;

//当字段为String类型是设置字段长度

if(pField.VarType==8)

pDataColumn.MaxLength=pField.Length;

//字段添加到表中

pDataTable.Columns.Add(pDataColumn);

pField=null;

pDataColumn=null;

//取得图层类型

stringshapeType=GetShapeType(pLayer);

//创建DataTable的行对象

DataRowpDataRow=null;

ICursorpCursor=pTable.Search(null,false);

//取得ITable中的行信息

IRowpRow=pCursor.NextRow();

while(pRow!

=null)

//新建DataTable的行对象

pDataRow=pDataTable.NewRow();

pRow.Fields.FieldCount;

//如果字段类型为esriFieldTypeGeometry,则根据图层类型设置字段值

if(pRow.Fields.get_Field(i).Type==esriFieldType.esriFieldTypeGeometry)

pDataRow[i]=shapeType;

//当图层类型为Anotation时,要素类中会有esriFieldTypeBlob类型的数据,

//其存储的是标注内容,如此情况需将对应的字段值设置为Element

elseif(pRow.Fields.get_Field(i).Type==esriFieldType.esriFieldTypeBlob)

pDataRow[i]="

Element"

;

else

pDataRow[i]=pRow.get_Value(i);

//添加DataRow到DataTable

pDataTable.Rows.Add(pDataRow);

pDataRow=null;

pRow=pCursor.NextRow();

returnpDataTable;

6、在ClassOpenAttributeTable类中建立自定义方法GetShapeType。

privatestringGetShapeType(ILayerpLayer)

IFeatureLayerpFeatLyr=(IFeatureLayer)pLayer;

switch(pFeatLyr.FeatureClass.ShapeType)

caseesriGeometryType.esriGeometryPoint:

return"

Point"

caseesriGeometryType.esriGeometryPolyline:

Polyline"

caseesriGeometryType.esriGeometryPolygon:

Polygon"

default:

"

7、在ClassOpenAttributeTable类中建立自定义方法ParseFieldType。

privatestringParseFieldType(esriFieldTypefieldType)

switch(fieldType)

caseesriFieldType.esriFieldTypeBlob:

System.String"

caseesriFieldType.esriFieldTypeDate:

System.DateTime"

caseesriFieldType.esriFieldTypeDouble:

System.Double"

caseesriFieldType.esriFieldTypeGeometry:

caseesriFieldType.esriFieldTypeGlobalID:

caseesriFieldType.esriFieldTypeGUID:

caseesriFieldType.esriFieldTypeInteger:

System.Int32"

caseesriFieldType.esriFieldTypeOID:

caseesriFieldType.esriFieldTypeRaster:

caseesriFieldType.esriFieldTypeSingle:

System.Single"

caseesriFieldType.esriFieldTypeSmallInteger:

caseesriFieldType.esriFieldTypeString:

8、在ClassOpenAttributeTable类中建立自定义方法GetValidLayerName。

publicstringGetValidLayerName(stringstrLayerName)//图层名称不能为"

."

intdot=strLayerName.IndexOf("

);

if(dot!

=-1)

returnstrLayerName.Replace("

"

_"

returnstrLayerName;

9、在主窗体的contextMenuStrip控件的“打开属性表”按钮中添加如下代码:

privatevoidMenuOpenTabel_Click(objectsender,EventArgse)

IBasicMapobjMap=newMapClass();

ILayerobjLayer=newFeatureLayerClass();

objectobjOther=newobject();

objectobjIndex=newobject();

esriTOCControlItemobjItem=newesriTOCControlItem();

try

axTOCControl1.GetSelectedItem(refobjItem,refobjMap,refobjLayer,refobjOther,refobjIndex);

catch

MessageBox.Show("

获取选择图层类型错误!

错误"

MessageBoxButtons.OK,MessageBoxIcon.Error);

DataTableobjDataTable=null;

if(objItem==esriTOCControlItem.esriTOCControlItemLayer)//在图层中弹出右键菜单

ClassOpenAttributeTableobjClassOpenAttributeTable=newClassOpenAttributeTable();

objDataTable=objClassOpenAttributeTable.CreateDataTableByLayer(objLayer,objClassOpenAttributeTable.GetValidLayerName(objLayer.Name));

foreach(FormopenForminApplication.OpenForms)

if(openForm.Name.Equals("

FormAttributeTable"

))

openForm.Close();

break;

IMapControl3pMapControl=axMapControl1.ObjectasIMapControl3;

FormAttributeTableobjForm=newFormAttributeTable(objDataTable,pMapControl,objLayer);

objForm.Show();

10、在axTOCControl的OnMouseDown事件中添加如下代码。

if(e.button==2)

axTOCControl1.HitTest(e.x,e.y,refobjItem,refobjMap,refobjLayer,refobjOther,refobjIndex);

弹出右键菜单错误!

if(objItem==esriTOCControlItem.esriTOCControlItemMap)//在地图上弹出右键菜单

//显示右键菜单

contextMenuStrip1.Show(axTOCControl1,e.x,e.y);

11、在弹出窗体的load事件中添加如下代码。

privatevoidFormAttributeTable_Load(objectsender,EventArgse)

dataGridView1.DataSource=objDataTable;

this.Text="

<

+objDataTable.TableName+"

>

属性表"

//dataGridView默认加载时为全部选中记录,需取消选择

IMappMap=objMapControl.ActiveView.FocusMap;

pMap.ClearSelection();

12、在dataGridView的SelectionChanged事件中添加如下代码,实现属性表与地图同步。

privatevoiddataGridView1_SelectionChanged(objectsender,EventArgse)

IMappMap;

pMap=objMapControl.ActiveView.FocusMap;

IActiveViewpActiveView;

pActiveView=(IActiveView)pMap;

pActiveView.Refresh();

IQueryFilterpQueryFilter=newQueryFilterClass();

IFeatureLayerpFeatureLayer;

pFeatureLayer=(IFeatureLayer)objLayer;

IFieldspFields;

pFields=pFeatureLayer.FeatureClass.Fields;

IFieldpField;

pField=pFields.get_Field(0);

stringsid;

dataGridView1.SelectedRows.Count;

sid=dataGridView1.SelectedRows[i].Index.ToString();

if(i==0)

pQueryFilter.WhereClause=(pField.Name).ToString()+"

="

+sid;

pQueryFilter.WhereClause+="

or"

+(pField.Name).ToString()+"

IFeatureCursorpFeatureCursor;

pFeatureCursor=pFeatureLayer.FeatureClass.Search(pQueryFilter,false);

IFeaturepFeatrue=pFeatureCursor.NextFeature();

while(pFeatrue!

pMap.SelectFeature(pFeatureLayer,pFeatrue);

pFeatrue=pFeatureCursor.NextFeature();

地图同步显示出错!

13、程序运行结果如下。

五、思考题:

1、C#中的接口和类有什么异同?

2、break、continue、goto和return有什么区别?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1