ArcGisEngine实现显示属性表:
效果:

一、拖入DataGridView
从工具箱拖一个DataGridView控件到窗体.
二、创建空的DataTable
首先传入ILayer,在查询ITable,在从ITable中的Filed中的Fileds中获取每个Field,在根据Field设置DataTable的DataColumn,由此创建一个空的DataTable
private static DataTable CreateDataTableByLayer(ILayer pLayer, string tableName)
{
//创建一个DataTable表
DataTable pDataTable = new DataTable(tableName);
//取得ITable接口
ITable pTable = pLayer as ITable;
IField pField = null;
DataColumn pDataColumn;
//根据每个字段的属性建立DataColumn对象
for (int i = 0; i < pTable.Fields.FieldCount; i++)
{
pField = pTable.Fields.get_Field(i);
//新建一个DataColumn并设置其属性
pDataColumn = new DataColumn(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;
}
return pDataTable;
}
//因为GeoDatabase的数据类型与.NET的数据类型不同,故要进行转换。转换函数如下:
public static string ParseFieldType(esriFieldType fieldType)
{
switch (fieldType)
{
case esriFieldType.esriFieldTypeBlob:
return "System.String";
case esriFieldType.esriFieldTypeDate:
return "System.DateTime";
case esriFieldType.esriFieldTypeDouble:
return "System.Double";
case esriFieldType.esriFieldTypeGeometry:
return "System.String";
case esriFieldType.esriFieldTypeGlobalID:
return "System.String";
case esriFieldType.esriFieldTypeGUID:
return "System.String";
case esriFieldType.esriFieldTypeInteger:
return "System.Int32";
case esriFieldType.esriFieldTypeOID:
return "System.String";
case esriFieldType.esriFieldTypeRaster:
return "System.String";
case esriFieldType.esriFieldTypeSingle:
return "System.Single";
case esriFieldType.esriFieldTypeSmallInteger:
return "System.Int32";
case esriFieldType.esriFieldTypeString:
return "System.String";
default:
return "System.String";
}
}
三、装载数据:
public static DataTable CreateDataTable(ILayer pLayer, string tableName)
{
//创建空DataTable
DataTable pDataTable = CreateDataTableByLayer(pLayer, tableName);
//取得图层类型
string shapeType = getShapeType(pLayer);
//创建DataTable的行对象
DataRow pDataRow = null;
//从ILayer查询到ITable
ITable pTable = pLayer as ITable;
ICursor pCursor = pTable.Search(null, false);
//取得ITable中的行信息
IRow pRow = pCursor.NextRow();
int n = 0;
while (pRow != null)
{
//新建DataTable的行对象
pDataRow = pDataTable.NewRow();
for (int i = 0; i < pRow.Fields.FieldCount; i++)
{
//如果字段类型为esriFieldTypeGeometry,则根据图层类型设置字段值
if (pRow.Fields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry)
{
pDataRow[i] = shapeType;
}
//当图层类型为Anotation时,要素类中会有esriFieldTypeBlob类型的数据,
//其存储的是标注内容,如此情况需将对应的字段值设置为Element
else if (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;
n++;
//为保证效率,一次只装载最多条记录
if (n == 2000)
{
pRow = null;
}
else
{
pRow = pCursor.NextRow();
}
}
return pDataTable;
}
public static string getShapeType(ILayer pLayer)
{
IFeatureLayer pFeatLyr = (IFeatureLayer)pLayer;
switch (pFeatLyr.FeatureClass.ShapeType)
{
case esriGeometryType.esriGeometryPoint:
return "Point";
case esriGeometryType.esriGeometryPolyline:
return "Polyline";
case esriGeometryType.esriGeometryPolygon:
return "Polygon";
default:
return "";
}
}
四、绑定DataTable到DataGridView
public void CreateAttributeTable(ILayer player)
{
string tableName;
tableName = getValidFeatureClassName(player.Name);
attributeTable = CreateDataTable(player, tableName);
this.dataGridView1.DataSource = attributeTable;
this.Text = "属性表[" + tableName + "] " + "记录数:" + attributeTable.Rows.Count.ToString();
}
public static string getValidFeatureClassName(string FCname)
{
int dot = FCname.IndexOf(".");
if (dot != -1)
{
return FCname.Replace(".", "_");
}
return FCname;
}
五、调用并显示:
1.在axTOCControl1_OnMouseDown方法中得到ILayer,赋countTableLayer.
if (e.button == 2)
{
axMapControl1.CustomProperty = pLyr;
//将当前图层传给countTableLayer.便于在功能5中使用
countTableLayer = pLyr;
if (pLyr != null && pItem == esriTOCControlItem.esriTOCControlItemLayer)
contextMenuStrip1.Show(axTOCControl1, e.x, e.y);
}
2.在显示属性表ToolStripMenuItem_Click()中调用.
private void 显示属性表ToolStripMenuItem_Click(object sender, EventArgs e)
{
CreateAttributeTable(countTableLayer);
}
六、更多及详情:
http://www.gissky.net/Article/1574.htm
1174

被折叠的 条评论
为什么被折叠?



