Arc Engine二次开发——弹窗进行属性查询
在Arcmap中使用Sapefile格式的矢量数据时,经常会用到其属性查询的功能,弹出窗体然后用户鼠标点击或手动输入查询条件,进而查询到感兴趣的要素。在AE二次开发中也经常需要这个功能,于是在此记录整个开发过程。
首先当然是需要构建一个Visual C# Windows窗体应用程序,然后添加axMapControl等控件,这些过程不再赘述。
然后新建一个名为FormQueryAttr.cs的窗体,用于属性查询时弹出,其界面设置为如下:

其中要素为:一个ComboBox(cboLayer);两个ListBox(listBoxField和listBoxValue);一个GroupBox;一个TextBox(textBoxSql)
21个Button,表达式所需的19个button的名称如下:
btnequal、btnunequal、btnis、btnlike、btnmore、btnless、btnmoe、btnloe、btnor、btnnull、btnnot、btnand、btnin、btnunderline、btnpercent、btncharacter、btnbetween、btnspace、btnempty
点击查看代码,添加以下变量并在构造函数中添加以下语句:
//地图数据
private AxMapControl mMapControl;
//选中的图层
private IFeatureLayer mFeatureLayer;
//根据所选择的图层查询得到的特征类
private IFeatureClass pFeatureClass = null; public FormQueryAttr(AxMapControl mapControl)
{
InitializeComponent();
this.mMapControl = mapControl;
}
接着回到程序主界面,添加属性查询的Button按钮,在其点击响应函数中添加如下代码:
//属性查询
private void barButtonItem13_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
FormQueryAttr formqueryattr = new FormQueryAttr(this.axMapControl1);
formqueryattr.Show();
}
至此,程序运行且用户点击“属性查询”按钮时,会初始化FormQueryAttr.cs窗体,将整个axMapControl作为参数传入,并显示窗体。
然后再回到FormQueryAttr.cs窗体的代码中,做以下更改:
在其Load函数中为cboLayer添加所有图层名称,代码如下:
private void FormQueryAttr_Load(object sender, EventArgs e)
{
//MapControl中没有图层时返回
if (this.mMapControl.LayerCount <= )
return;
//获取MapControl中的全部图层名称,并加入ComboBox
ILayer pLayer;
//图层名称
string strLayerName;
for (int i = ; i < this.mMapControl.LayerCount; i++)
{
pLayer = this.mMapControl.get_Layer(i);
strLayerName = pLayer.Name;
//图层名称加入cboLayer
this.cboLayer.Items.Add(strLayerName);
}
//默认显示第一个选项
this.cboLayer.SelectedIndex = ;
}
为cboLayer添加SelectedIndexChanged响应事件,其中代码如下:
private void cboLayer_SelectedIndexChanged(object sender, EventArgs e)
{
this.listBoxField.Items.Clear();
//获取cboLayer中选中的图层
mFeatureLayer = mMapControl.get_Layer(cboLayer.SelectedIndex) as IFeatureLayer;
pFeatureClass = mFeatureLayer.FeatureClass;
string strFldName;
for (int i = ; i < pFeatureClass.Fields.FieldCount; i++)
{
strFldName = pFeatureClass.Fields.get_Field(i).Name;
this.listBoxField.Items.Add(strFldName);
}
this.listBoxField.SelectedIndex = ;
this.label8.Text = mFeatureLayer.Name;
}
为listBoxField添加SelectedIndexChanged和DoubleClick响应事件,其中代码如下:
private void listBoxField_SelectedIndexChanged(object sender, EventArgs e)
{
string sFieldName = listBoxField.Text;
listBoxValue.Items.Clear();
int iFieldIndex = ;
IField pField = null;
IFeatureCursor pFeatCursor = pFeatureClass.Search(null, true);
IFeature pFeat = pFeatCursor.NextFeature();
iFieldIndex = pFeatureClass.FindField(sFieldName);
pField = pFeatureClass.Fields.get_Field(iFieldIndex);
while (pFeat != null)
{
listBoxValue.Items.Add(pFeat.get_Value(iFieldIndex));
pFeat = pFeatCursor.NextFeature();
} }
private void listBoxField_DoubleClick(object sender, EventArgs e)
{
textBoxSql.SelectedText = listBoxField.SelectedItem.ToString() + " ";
}
为listBoxValue添加DoubleClick响应事件,其中代码如下:
private void listBoxValue_DoubleClick(object sender, EventArgs e)
{
textBoxSql.SelectedText = listBoxValue.SelectedItem.ToString() + " ";
}
然后对“表达式”中的按钮添加对应的点击响应函数,具体代码如下:
private void btnequal_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = "= ";
} private void btnis_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = "is ";
} private void btncharacter_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = "'' ";
} private void btnempty_Click(object sender, EventArgs e)
{
this.textBoxSql.Text = "";
} private void btnunequal_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = "!= ";
} private void btnlike_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = "like ";
} private void btnmore_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = "> ";
} private void btnmoe_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = ">= ";
} private void btnloe_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = "<= ";
} private void btnor_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = " or ";
} private void btnnull_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = "Null ";
} private void btnless_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = "< ";
} private void btnnot_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = " Not ";
} private void btnand_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = " And ";
} private void btnin_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = " In ";
} private void btnunderline_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = "_";
} private void btnpercent_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = "% ";
} private void btnbetween_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = " Between ";
} private void btnspace_Click(object sender, EventArgs e)
{
textBoxSql.SelectedText = " ";
}
最后对按钮“查找”和“取消”添加点击响应函数,代码如下:
private void button1_Click(object sender, EventArgs e)
{
try
{
mMapControl.Map.ClearSelection(); //清除上次查询结果
IActiveView pActiveView = mMapControl.Map as IActiveView;
//pQueryFilter的实例化
IQueryFilter pQueryFilter = new QueryFilterClass();
//设置查询过滤条件
pQueryFilter.WhereClause = textBoxSql.Text;
//search的参数第一个为过滤条件,第二个为是否重复执行
IFeatureCursor pFeatureCursor = mFeatureLayer.Search(pQueryFilter, false);
//获取查询到的要素
IFeature pFeature = pFeatureCursor.NextFeature();
//判断是否获取到要素
while (pFeature != null)
{
mMapControl.Map.SelectFeature(mFeatureLayer, pFeature); //选择要素
pFeature = pFeatureCursor.NextFeature();
}
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
pActiveView.Refresh();//刷新图层
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} } private void button2_Click(object sender, EventArgs e)
{
this.Hide();
}
到此为止,所有属性查询的工作已经完成,使用效果如下图所示:


如果需要清除所选要素,则添加按钮,并在其点击响应函数中添加如下代码即可:
//清空查询
private void barButtonItem14_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
axMapControl1.Map.ClearSelection();
axMapControl1.Refresh();
}
Arc Engine二次开发——弹窗进行属性查询的更多相关文章
- 基于Java的Arc Engine二次开发的环境的配置
1.软件准备 ArcGIS for Desktop 10.2, Arc engine, jdk-7u60-windows-i586,Eclipse Mar2 2.软件的安装 2.1 ArcGIS fo ...
- 【UG二次开发】创建、查询、编辑成型特征的函数
创建成型特征函数UF_MODL_create_boss 通过设置凸台的参数建立凸台特征UF_MODL_create_rect_pad 通过设置矩形凸垫的参数建立矩形凸垫特征UF_MODL_create ...
- 【读书笔记】《基于UG NX系统的二次开发》笔记
我有几本二次开发的书,但是从头到尾读下来的却没有几本.有时候遇到困难发帖求助,好不容易得到答案.后来却发现在书上的前几章就有详细介绍.读书笔记不仅是一种记录,更是一种督促自己读书的方法.还有一个原因是 ...
- SVN二次开发——让SVN、TSVN(TortoiseSVN)支持windows的访问控制模型、NTFS ADS(可选数据流、NTFS的安全属性)
SVN二次开发 ——让SVN.TSVN(TortoiseSVN)支持windows的访问控制模型.NTFS ADS (可选数据流.NTFS的安全属性) SVN secondary developmen ...
- AE二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)
/* * 实习课上讲进阶功能所用文档,因为赶时间从网上抄抄改改,凑合能用,记录一下以备个人后用. * * ----------------------------------------------- ...
- Qt+QGIS二次开发:自定义类实现查询矢量数据的属性字段值(图查属性)
在GIS领域,有两种重要的查询操作,图查属性和属性查图. 本文主要介绍如何在QGIS中通过从QgsMapToolIdentify中派生自定义类实现查询矢量数据的属性字段值(图查属性). 重点参考资料: ...
- ArcGIS Engine开发之属性查询
属性查询即基于空间数据的属性数据的查询,通过用户提交SQL语言中的where语句定义的查询条件,对属性数据进行搜索,从而得到查询结果的操作. 相关的类与接口 与属性查询功能相关的类主要有QureyFi ...
- [ArcEngine二次开发]为Feature的属性赋值
在创建FeatureClass之后,需要为FeatureClass添加Features,在为Feature的字段赋值时,代码大致如下: 在这里赋值的时候,出现了一个错误: The operation ...
- WeCenter二次开发教程(一):熟悉模板结构
<1>程序文件目录介绍: app – 应用目录 models – 模型目录 plugins – 插件目录 static – 静态文件 system – 系统目录 views – 模板目录 ...
随机推荐
- evo:评测slam参数设置
zn@buaa:~$ evo_ape euroc m1/state_groundtruth_estimate0/data.csv pl-svo-master2/trajout.txt -angle_d ...
- ES6深入浅出-8 新版的类(下集)-2.全部语法
解答提问 两边都没有构造函数的情况 父类没有构造函数,子类有构造函数的情况 下面用到的了this.body这个属性,所以super()必须要放在这行代码的上面. 在调用this之前必须调用super( ...
- C#关于时间(获取特定格式的时间及多种方式获取当前时间戳)以及10位和13位时间戳转为特定格式
C#关于时间(获取特定格式的时间及多种方式获取当前时间戳)以及10位和13位时间戳转为特定格式 置顶 2018年03月06日 19:16:51 黎筱曦 阅读数:19098 标签: C#时间 更多 个人 ...
- JS获当前网页元素高度offsetHeight
本文测试的是offsetHeight,获取网页中某元素的高度,单位是像素,获取的类型是整型,可以进行数字运算.如图,网页中的元素本身的高度包括,自身的内容+padding+border,而margin ...
- 对ThreadLocal的理解
参考文档:https://www.cnblogs.com/moonandstar08/p/4912673.html 一.定义:线程本地变量,每个线程中的变量相互独立,互不影响. 官方定义: 1 ...
- SpringBoot学习笔记:自定义拦截器
SpringBoot学习笔记:自定义拦截器 快速开始 拦截器类似于过滤器,但是拦截器提供更精细的的控制能力,它可以在一个请求过程中的两个节点进行拦截: 在请求发送到Controller之前 在响应发送 ...
- Swoole练习 websocket
WEBSOCKET 服务端代码 //创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = new swoole_websocket_server("0.0.0.0& ...
- Freemarker讲解
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP.它不仅可以用作表现层的实现 ...
- linux编程 新建一个进程的方法
学习到一种,直接调用系统函数,在类的构造函数中直接启动一个线程,例如,某个类是用来监听串口的,可以直接在其构造函数中调用系统函数,开辟一个进程,在该进程对应的函数中不断while(1){....} h ...
- Ubuntu中打开Qt creator,提示无法覆盖文件 /home/username/.config/Nokia/qtversion.xml : Permission denied
官网下载qt*.run文件安装后 打开Qt creator,提示无法覆盖文件 /home/username/.config/Nokia/qtversion.xml : Permission denie ...