GIS二次开发实验指导书8Word文档下载推荐.docx
《GIS二次开发实验指导书8Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《GIS二次开发实验指导书8Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
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有什么区别?