国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
第八講 屬性數(shù)據(jù)表的查詢顯示

第八講 屬性數(shù)據(jù)表的查詢顯示

 

在上一講中,我們完成了圖層符號(hào)選擇器的制作。這一講中,我們將實(shí)現(xiàn)圖層屬性數(shù)據(jù)表的查詢顯示。

在ArcMap中,單擊圖層右鍵菜單中的“Open Attribute Table”命令,便可彈出屬性數(shù)據(jù)表。本講將完成類似的功能,效果如下:

 

圖1

數(shù)據(jù)表顯示,我們用了DataGridView控件。DataGridView 控件提供一種強(qiáng)大而靈活的以表格形式顯示數(shù)據(jù)的方式??梢允褂?DataGridView 控件來顯示少量數(shù)據(jù)的只讀視圖,也可以對(duì)其進(jìn)行縮放以顯示特大數(shù)據(jù)集的可編輯視圖。我們可以很方便地把一個(gè)DataTable作為數(shù)據(jù)源綁定到DataGridView控件中。

本講的思路大體如下:首先根據(jù)圖層屬性中的字段創(chuàng)建一個(gè)空的DataTable,然后根據(jù)數(shù)據(jù)內(nèi)容一行行填充DataTable數(shù)據(jù),再將DataTable綁定到DataGridView控件,最后調(diào)用并顯示屬性表窗體。

1.創(chuàng)建屬性表窗體

新建一個(gè)Windows窗體,命名為“AttributeTableFrm.cs”。

從工具箱拖一個(gè)DataGridView控件到窗體,并將其Dock屬性設(shè)置為“Fill”。

添加如下引用:

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Controls;

using ESRI.ArcGIS.esriSystem;

using ESRI.ArcGIS.SystemUI;

using ESRI.ArcGIS.Geometry;

using ESRI.ArcGIS.Geodatabase;

2.創(chuàng)建空DataTable

首先傳入ILayer,再查詢到ITable,從ITable中的Fileds中獲得每個(gè)Field,再根據(jù)Filed設(shè)置DataTable的DataColumn,由此創(chuàng)建一個(gè)只含圖層字段的空DataTable。實(shí)現(xiàn)函數(shù)如下:

/// <summary>

/// 根據(jù)圖層字段創(chuàng)建一個(gè)只含字段的空DataTable

/// </summary>

/// <param name="pLayer"></param>

/// <param name="tableName"></param>

/// <returns></returns>

private static DataTable CreateDataTableByLayer(ILayer pLayer, string tableName)

{

//創(chuàng)建一個(gè)DataTable表

DataTable pDataTable = new DataTable(tableName);

//取得ITable接口

ITable pTable = pLayer as ITable;

IField pField = null;

DataColumn pDataColumn;

//根據(jù)每個(gè)字段的屬性建立DataColumn對(duì)象

for (int i = 0; i < pTable.Fields.FieldCount; i++)

{

pField = pTable.Fields.get_Field(i);

//新建一個(gè)DataColumn并設(shè)置其屬性

pDataColumn = new DataColumn(pField.Name);

if (pField.Name == pTable.OIDFieldName)

{

pDataColumn.Unique = true;//字段值是否唯一

}

//字段值是否允許為空

pDataColumn.AllowDBNull = pField.IsNullable;

//字段別名

pDataColumn.Caption = pField.AliasName;

//字段數(shù)據(jù)類型

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

//字段默認(rèn)值

pDataColumn.DefaultValue = pField.DefaultValue;

//當(dāng)字段為String類型是設(shè)置字段長(zhǎng)度

if (pField.VarType == 8)

{

pDataColumn.MaxLength = pField.Length;

}

//字段添加到表中

pDataTable.Columns.Add(pDataColumn);

pField = null;

pDataColumn = null;

}

return pDataTable;

}

因?yàn)镚eoDatabase的數(shù)據(jù)類型與.NET的數(shù)據(jù)類型不同,故要進(jìn)行轉(zhuǎn)換。轉(zhuǎn)換函數(shù)如下:

/// <summary>

/// 將GeoDatabase字段類型轉(zhuǎn)換成.Net相應(yīng)的數(shù)據(jù)類型

/// </summary>

/// <param name="fieldType">字段類型</param>

/// <returns></returns>

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";

}

}

3.裝載DataTable數(shù)據(jù)

從上一步得到的DataTable還沒有數(shù)據(jù),只有字段信息。因此,我們要通過ICursor從ITable中逐一取出每一行數(shù)據(jù),即IRow。再創(chuàng)建DataTable中相應(yīng)的DataRow,根據(jù)IRow設(shè)置DataRow信息,再將所有的DataRow添加到DataTable中,就完成了DataTable數(shù)據(jù)的裝載。

為保證效率,一次最多只裝載2000條數(shù)據(jù)到DataGridView。函數(shù)代碼如下:

 /// <summary>

/// 填充DataTable中的數(shù)據(jù)

/// </summary>

/// <param name="pLayer"></param>

/// <param name="tableName"></param>

/// <returns></returns>

public static DataTable CreateDataTable(ILayer pLayer, string tableName)

{

//創(chuàng)建空DataTable

DataTable pDataTable = CreateDataTableByLayer(pLayer, tableName);

//取得圖層類型

string shapeType = getShapeType(pLayer);

//創(chuàng)建DataTable的行對(duì)象

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的行對(duì)象

pDataRow = pDataTable.NewRow();

for (int i = 0; i < pRow.Fields.FieldCount; i++)

{

//如果字段類型為esriFieldTypeGeometry,則根據(jù)圖層類型設(shè)置字段值

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

{

pDataRow[i] = shapeType;

}

//當(dāng)圖層類型為Anotation時(shí),要素類中會(huì)有esriFieldTypeBlob類型的數(shù)據(jù),

//其存儲(chǔ)的是標(biāo)注內(nèi)容,如此情況需將對(duì)應(yīng)的字段值設(shè)置為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;

}

上面的代碼中涉及到一個(gè)獲取圖層類型的函數(shù)getShapeTape,此函數(shù)是通過ILayer判斷圖層類型的,代碼如下:

/// <summary>

/// 獲得圖層的Shape類型

/// </summary>

/// <param name="pLayer">圖層</param>

/// <returns></returns>

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 "";

}

}

4.綁定DataTable到DataGridView

通過以上步驟,我們已經(jīng)得到了一個(gè)含有圖層屬性數(shù)據(jù)的DataTable。現(xiàn)定義一個(gè)AttributeTableFrm類的成員變量:

 public DataTable attributeTable;

通過以下函數(shù),我們很容易將其綁定到DataGridView控件中。

 /// <summary>

/// 綁定DataTable到DataGridView

/// </summary>

/// <param name="player"></param>

public void CreateAttributeTable(ILayer player)

{

string tableName;

tableName = getValidFeatureClassName(player .Name );

attributeTable = CreateDataTable(player,tableName );

this.dataGridView1 .DataSource = attributeTable ;

this.Text = "屬性表[" + tableName + "] " + "記錄數(shù):"+attributeTable.Rows.Count .ToString();

}

因?yàn)镈ataTable的表名不允許含有“.”,因此我們用“_”替換。函數(shù)如下:

/// <summary>

/// 替換數(shù)據(jù)表名中的點(diǎn)

/// </summary>

/// <param name="FCname"></param>

/// <returns></returns>

public static string getValidFeatureClassName(string FCname)

{

int dot = FCname.IndexOf(".");

if (dot != -1)

{

return FCname.Replace(".", "_");

}

return FCname;

}

5.調(diào)用屬性表窗體

通過1-4步驟,我們封裝了一個(gè)AttributeTableFrm類,此類能夠由ILayer顯示圖層中的屬性表數(shù)據(jù)。那怎么調(diào)用AttributeTableFrm呢?

前面已經(jīng)提到,我們是在TOCControl選中圖層的右鍵菜單中彈出屬性表窗體的,因此我們需要添加一個(gè)菜單項(xiàng)到TOCControl中Layer的右鍵菜單。而在第六講中,我們采用的是AE中的IToolbarMenu實(shí)現(xiàn)右鍵菜單的,故我們還需自定義一個(gè)Command,實(shí)現(xiàn)打開屬性表的功能。

以ArcGIS的Base Command為模板新建項(xiàng)“OpenAttributeTable.cs”。

注意:新建Base Command模板時(shí),會(huì)彈出一個(gè)對(duì)話框讓我們選擇模板適用對(duì)象,這時(shí)我們要選擇MapControl、PageLayoutControl,即選擇第二項(xiàng)或者倒數(shù)第二項(xiàng)。

添加如下引用:

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Display;

using ESRI.ArcGIS.esriSystem;

添加成員變量:

 private ILayer m_pLayer;

修改構(gòu)造函數(shù)為:

 public OpenAttributeTable(ILayer pLayer)

{

//

// TODO: Define values for the public properties

//

base.m_category = ""; //localizable text

base.m_caption = "打開屬性表"; //localizable text

base.m_message = "打開屬性表"; //localizable text

base.m_toolTip = "打開屬性表"; //localizable text

base.m_name = "打開屬性表"; //unique id, non-localizable (e.g. "MyCategory_MyCommand")

m_pLayer = pLayer;

try

{

//

// TODO: change bitmap name if necessary

//

string bitmapResourceName = GetType().Name + ".bmp";

base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);

}

catch (Exception ex)

{

System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap")

}

}

再在On_Click函數(shù)中添加如下代碼,以創(chuàng)建并打開屬性表窗體。

 /// <summary>

/// Occurs when this command is clicked

/// </summary>

public override void OnClick()

{

// TODO: Add OpenAttributeTable.OnClick implementation

AttributeTableFrm attributeTable = new AttributeTableFrm();

attributeTable.CreateAttributeTable(m_pLayer);

attributeTable.ShowDialog();

}

至此,我們完成了OpenAttributeTable命令。顯然,我們要在TOCControl的OnMouseDown事件中調(diào)用此命令。

因?yàn)?,?dāng)前選中的圖層參數(shù),即ILayer是通過OpenAttributeTable的構(gòu)造函數(shù)傳入的,而選中的ILayer是動(dòng)態(tài)變化的,所以我們無法在窗體初始化的Form1_Load事件中就添加OpenAttributeTable菜單項(xiàng)到右鍵菜單。但我們可以在OnMouseDown事件中動(dòng)態(tài)添加OpenAttributeTable菜單項(xiàng)。

要注意的是,最后我們必須移除添加的OpenAttributeTable菜單項(xiàng),不然每次按下右鍵都會(huì)添加此菜單項(xiàng),將造成右鍵菜單中含有多個(gè)OpenAttributeTable菜單項(xiàng)。

修改TOCControl的OnMouseDown事件的部分代碼如下:

 private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)

{

//……

//彈出右鍵菜單

if (item == esriTOCControlItem.esriTOCControlItemMap)

m_menuMap.PopupMenu(e.x, e.y, m_tocControl.hWnd);

if (item == esriTOCControlItem.esriTOCControlItemLayer)

{

//動(dòng)態(tài)添加OpenAttributeTable菜單項(xiàng)

m_menuLayer.AddItem(new OpenAttributeTable(layer), -1, 2, true, esriCommandStyles.esriCommandStyleTextOnly);

m_menuLayer.PopupMenu(e.x, e.y, m_tocControl.hWnd);

//移除OpenAttributeTable菜單項(xiàng),以防止重復(fù)添加

m_menuLayer.Remove(2);

}

}

6.編譯運(yùn)行

按下F5,編譯運(yùn)行程序,相信你已經(jīng)實(shí)現(xiàn)了開篇處展示的屬性表效果了吧!

以上代碼在Windows XP Sp3 + VS2005 + AE9.2環(huán)境下編譯通過。

下一講中,我將給大家?guī)淼氖菆D層文字標(biāo)注的實(shí)現(xiàn)

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ResultSet結(jié)果集轉(zhuǎn)換為實(shí)體對(duì)象實(shí)現(xiàn)方案
ASP.NET C#生成下拉列表樹實(shí)現(xiàn)代碼
datagridview總結(jié)
C# 中利用反射機(jī)制拷貝類的字段和屬性(拷貝一個(gè)類對(duì)象的所有東西付給另一個(gè)類對(duì)象,而不是付給引用地址)
ArcEngine獲取ArcGIS Server上的地圖服務(wù)
Server操作Mxd文件詳細(xì)講解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服