`
Cb123456
  • 浏览: 66451 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

显示属性表

    博客分类:
  • web
阅读更多

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

  • 大小: 4.6 MB
8
3
分享到:
评论

相关推荐

    ae实现点击图层弹出属性表

    本文将详细介绍如何利用AE中的C#编程语言来实现一个实用的功能——通过双击图层来弹出该图层的属性表。这一功能对于地图浏览和数据分析具有重要意义。 #### 二、核心代码解析 ##### 1. 获取图层字段信息 ```csharp...

    查看shapefile图层的属性表

    然后,可以利用`IColumns`接口获取列信息,`ICursor`和`IRow`接口遍历和显示属性表内容。在C#中,这可以通过循环和数据绑定到控件(如DataGridView)实现。 5. **右键菜单事件处理**:为了响应用户右键点击图层名,...

    MFC VC++属性页和属性表源码

    4. **主程序文件**(.cpp):创建并显示属性表的代码,通常在`WinMain()`或`int main()`函数中。 学习和理解这些源码可以帮助开发者掌握如何在实际项目中灵活运用MFC的属性页和属性表功能,创建具有用户友好的配置...

    VC 在对话框中使用TAB属性表.rar

    4. **显示属性表**:最后,在主程序中创建属性表对象并显示。 ```cpp int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow) { ...

    基于vc的很好的属性表程序

    首先,创建一个CPropertySheet对象,然后添加属性页对象,最后调用DoModal()方法来显示属性表。 2. 创建属性页: 同样,使用CPropertyPage类创建属性页。为每个属性页定义一个新的类,继承自CPropertyPage,然后在...

    ArcGIS Engine+C#_属性数据表的查询显示

    5. 调用并显示属性表窗体 在主程序或其他适当的地方调用这个窗体,显示属性数据表。例如: ```csharp private void ShowAttributeTable(ILayer layer) { AttributeTableFrm attributeTableForm = new ...

    ARCMAP-ARCGIS应用-管理属性表.ppt

    显示属性表可以对其显示效果进行调整设置,例如对列的宽度、列的位置调整、列的冻结、以及属性表中字体设置,高亮显示设置等等。例如,可以改变列宽、列的位置调整、冻结列等等。 选择属性表可以对当前属性表中选中...

    Ex050105VC属性表属性页

    4. 最后,调用`CPropertySheet`的`DoModal`或`Create`函数来显示属性表。 在“Ex050105VC属性表属性页”的示例中,`PropertySheet.avi`很可能是一个教学视频,它可能详细演示了如何在VC++环境中创建和使用属性表和...

    Arcgis for android实现弹框查询属性表数据

    // 在这里获取并显示属性表数据 displayCallOut(feature); } } return false; } }); ``` `displayCallOut(Feature feature)`方法负责创建并显示CallOut。你可以获取到Feature的属性,并将其格式化后显示在...

    商业编程-源码-如何实现由列表控件控制的属性表.zip

    在本案例中,我们关注的是报告视图,因为它更适合于显示属性表的数据。 2. **属性表(Property Sheet)**:属性表是一种多页对话框,用于组织相关的设置或信息,每个页面代表一种属性或功能。用户可以通过标签在不同...

    QGIS二次开发:显示矢量图层的属性表,编程环境为QGIS3.28和VS2017

    这里实现两个基本的 GIS 软件需求:矢量图层的属性表显示,以及根据属性筛选要素。 具体需求如下: 1、加载一个矢量图层并打开其属性表; 2、输入筛选条件确认无误后,画布上和属性表中均只显示筛选后的要素。 属性...

    MFC属性表与向导

    4. 调用`CPropertySheet`的`DoModal`方法来显示属性表。 **向导( Wizards)** 向导是一种引导用户完成复杂任务的交互式过程。在MFC中,向导通常通过`CWizard97`或`CWizard`类来实现。向导的每一步都是一个对话框,...

    Arcgis 属性表中添加下拉选择项步骤(含截图)

    - **属性表**:用于显示要素类或表中的所有记录及其属性值。 - **属性域**:一种用于定义字段中允许的值集的工具,可以用于创建下拉列表。 - **字段**:每个属性表中的列,用于存储特定类型的信息。 #### 三、预设...

    商业编程-源码-如何实现类似VC属性表中的钉子按钮.zip

    你可以使用`PROPSHEETPAGE`结构来定义每个页面,并用`PropertySheet`函数创建和显示属性表。 3. **自定义控件**:钉子按钮是一种特殊的控件,可能需要自定义绘制。你可能需要创建一个新的按钮类,继承自`CButton`,...

    [1]arcgis属性表中选择同一属性的多个值.docx

    5. **应用选择**:完成上述步骤后,点击“确定”按钮,ArcGIS将根据你设定的条件在属性表中高亮显示选定的要素。这些要素现在被选中,可以进行进一步的操作,如更新属性、删除或者进行统计分析。 通过这种方式,你...

    32位整型Grid图添加属性表

    值得注意的是,属性表的生成可能不会立即在ArcCatalog中显示,需要对所在文件夹进行刷新,然后再次打开栅格数据集才能看到新生成的属性表。 通过以上讨论,我们不仅了解到在ArcGIS中为32位整型Grid栅格数据添加属性...

    Qt属性表控件-QtPropertyBrowser

    **Qt属性表控件——QtPropertyBrowser** QtPropertyBrowser是一种在Qt框架下实现的属性表控件,它允许用户以树形结构展示和编辑对象的属性。这个控件类似于QtCreator中的属性设置以及Visual Studio中的属性窗口,为...

    ArcEngine属性表自定义控件.rar

    1. **矢量数据加载**:控件能够加载ArcEngine中的矢量图层,提取并显示与其关联的属性表数据。 2. **分页显示**:为了处理大量数据,控件支持分页显示,这样用户不必一次性加载全部数据,提高了应用性能,同时也...

    VS2015 生成 添加 属性表

    在Visual Studio 2015(VS2015)中生成和添加属性表是一个增强项目配置管理的有效方法。属性表能够保存一组预设的编译器和链接器设置,使开发者能够快速地在不同项目间复制或继承这些设置。 首先,了解如何在VS2015...

    非模态属性表

    这个类或函数可能封装了创建、显示以及管理非模态属性表的过程,包括处理"OK"和"Cancel"按钮的事件,以及处理窗口位置和大小的保存与恢复。 在压缩包内的文件`ModelessPropertySheet`可能是一个源代码文件,包含了...

Global site tag (gtag.js) - Google Analytics