首页 > 其他分享 >ArcEngine|按属性查询

ArcEngine|按属性查询

时间:2023-04-03 23:24:12浏览次数:31  
标签:sender Text void object private 查询 图层 ArcEngine 属性

按属性查询

界面设计

image-20230403230501957

思路

该属性查询界面思路如下:

首先选择按属性查询方法,并打开功能界面;接着在“图层”下拉框中选择图层;图层选择好后,可从“字段”中选择该图层对应的查询字段,并可查看该字段的唯一值;使用按钮输入SQL查询语句,并可在下方的文本框中查看输入的SQL语句;命令编写完成后点击“Confirm and Execute”按钮,即可将查询到的结果返回右边的DataGridView中。点击“清除”按钮可以清除文本框中的SQL语句。

核心功能部分代码实现

变量定义

//变量定义
public IMap currentMap;//当前MapControl控件的Map对象
private IFeatureLayer currentFeatureLayer;//设置临时类变量来使用IFeatureLayer接口的当前图层对象
private string currentFileName;//设置临时类变量来存储字段名称
public ICursor ResultCursor;
private string WhereClause;
public DataGridView DataView;

/// <summary>
/// 获得当前MapControl控件中的对象
/// </summary>
public IMap CurrentMap
{
    set
    {
        currentMap = value;
    }
}

窗体加载事件

#region 窗体加载Load事件
private void AttributeQueryForm_Load(object sender, EventArgs e)
{
    try
    {
        //将当前图层列表清空
        comBoxLayerName.Items.Clear();
        string layerName;//设置临时变量存储图层名称
        //对Map中的每个图层进行判断并加载名称
        for (int i = 0; i < currentMap.LayerCount; i++)
        {
            //如果该图层为图层组类型,则分别对所包含的每个图层进行操作
            if (currentMap.get_Layer(i) is GroupLayer)
            {
                //使用ICompositeLayer接口进行遍历操作
                ICompositeLayer compositeLayer = currentMap.get_Layer(i) as ICompositeLayer;
                for (int j = 0; j < compositeLayer.Count; j++)
                {
                    //将图层的名称添加到comboxLayerName中
                    layerName = compositeLayer.get_Layer(j).Name;
                    comBoxLayerName.Items.Add(layerName);
                }
            }
            //如果图层不是图层组类型,则直接添加名称
            else
            {
                layerName = currentMap.get_Layer(i).Name;
                comBoxLayerName.Items.Add(layerName);
            }
        }
        //将comboxLayerName控件的默认选项设置为第一个图层名称
        comBoxLayerName.SelectedIndex = 0;
        //将comboxselectMethod控件的默认选项设置为第一种选择方式
    }
    catch { }
}
#endregion

图层名称下拉框中选择的图层发生改变时触发事件

#region 图层名称下拉框中选择的图层发生改变时触发事件
private void comBoxLayerName_SelectedIndexChanged(object sender, EventArgs e)
{
    //首先将字段列表和字段值列表清空
    ListBoxFields.Items.Clear();
    ListBoxValues.Items.Clear();
    IField field;//设置临时变量存储使用的IField接口对象
    for (int i = 0; i < currentMap.LayerCount; i++)
    {
        if (currentMap.get_Layer(i) is GroupLayer)
        {
            ICompositeLayer compositeLayer = currentMap.get_Layer(i) as ICompositeLayer;
            for (int j = 0; i < compositeLayer.Count; j++)
            {
                //判断图层的名称是否与comBoxLayerName控件中选择的图层名称相同
                if (compositeLayer.get_Layer(j).Name == comBoxLayerName.SelectedItem.ToString())
                {
                    //如果相同则设置为整个窗体使用的IFeatureLayer接口对象
                    currentFeatureLayer = compositeLayer.get_Layer(j) as IFeatureLayer;
                    break;
                }
            }
        }
        else
        {
            //判断图层的名称是否与comboxLayerName控件中选择的图层名称相同
            if (currentMap.get_Layer(i).Name == comBoxLayerName.SelectedItem.ToString())
            {
                //如果相同则设置为整个窗体所使用的IFeatureLayer接口对象
                currentFeatureLayer = currentMap.get_Layer(i) as IFeatureLayer;
                break;
            }
        }
    }
    //使用IFeatureClass接口对该图层的所有属性字段进行遍历,并填充listboxField控件
    for (int i = 0; i < currentFeatureLayer.FeatureClass.Fields.FieldCount; i++)
    {
        //根据索引值获取图层的字段
        field = currentFeatureLayer.FeatureClass.Fields.get_Field(i);
        //排除SHAPE字段,并在其他字段名称前后添加字符“\”
        if (field.Name.ToUpper() != "SHAPE")
            ListBoxFields.Items.Add(field.Name);
    }
    //更新labelSelectResult控件中的图层名称信息
    label3.Text = "Select * From " + currentFeatureLayer.Name + " WHERE:";
    //将显示where语句的文本内容清除
    txtSelectResult.Clear();
}
#endregion

选择字段改变时的触发事件

#region 选择字段改变时的触发事件
private void ListBoxFields_SelectedIndexChanged(object sender, EventArgs e)
{
    string sFieldName = ListBoxFields.Text;
    ListBoxValues.Items.Clear();
    int iFieldIndex = 0;
    IField pField = null;
    IFeatureClass pFeatureClass = currentFeatureLayer.FeatureClass;
    IFeatureCursor pFeatCursor = pFeatureClass.Search(null, true);
    IFeature pFeat = pFeatCursor.NextFeature();
    iFieldIndex = pFeatureClass.FindField(sFieldName);
    pField = pFeatureClass.Fields.get_Field(iFieldIndex);
    while (pFeat != null)
    {
        ListBoxValues.Items.Add(pFeat.get_Value(iFieldIndex));
        pFeat = pFeatCursor.NextFeature();
    }
}
#endregion

符号选择按钮

#region 各按钮的点击事件
//等于
private void btnEqual_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnEqual.Text + " ";
}

//不等于
private void btnNotEqual_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnNotEqual.Text + " ";
}

//Like
private void btnLike_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnLike.Text + " ";
}

//大于
private void btnMT_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnMT.Text + " ";
}

//大于等于
private void btnMTE_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnMTE.Text + " ";
}

//And
private void btnAnd_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnAnd.Text + " ";
}

//小于
private void btnLT_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnLT.Text + " ";
}

//小于等于
private void btnLTE_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnLTE.Text + " ";
}

//或
private void btnOr_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnOr.Text + " ";
}

//减
private void btnSub_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnSub.Text + " ";
}

//除
private void btnDiv_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnDiv.Text + " ";
}

//括号
private void btnParentheses_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnParentheses.Text + " ";
}

//IS
private void btnIs_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnIs.Text + " ";
}

//
private void btnNot_Click(object sender, EventArgs e)
{
    txtSelectResult.Text += " " + btnNot.Text + " ";
}
#endregion

生成查询语句

private ICursor PerformAttributeQuery(IFeatureLayer layer, string whereClause)
{
    IQueryFilter queryFilter = new QueryFilter();
    queryFilter.WhereClause = whereClause; 
    ICursor cursor = layer.Search(queryFilter, false) as ICursor;
    return cursor;
}

“Confirm and Execute”按钮

private void button1_Click(object sender, EventArgs e)
{
    this.DataView = this.dataGridView1;
    this.WhereClause = this.txtSelectResult.Text;
    if (this.WhereClause != string.Empty && this.currentFeatureLayer != null)
    {
        this.ResultCursor = this.PerformAttributeQuery(currentFeatureLayer,WhereClause);

    }
    if (this.DataView != null)
    {
        this.FillDataGrid(this.DataView);
    }
}

将查询的数据填入表格

private void FillDataGrid(DataGridView gridView)
{
    if (gridView == null || this.currentFeatureLayer == null || this.ResultCursor == null)
    {
        return;
    }
    IFeatureClass curFeatureClass = currentFeatureLayer.FeatureClass;
    this.DataView.Columns.Clear();
    IFields fields = ResultCursor.Fields;
    for (int i = 0; i < fields.FieldCount; i++)
    {
        DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
        column.HeaderText = fields.get_Field(i).Name;
        this.DataView.Columns.Add(column);
    }
    IRow row = ResultCursor.NextRow();
    while (row != null)
    {
        object[] values = new object[row.Fields.FieldCount];
        for (int i = 0; i < row.Fields.FieldCount; i++)
        {
            values[i] = row.Value[i];

        }
        this.DataView.Rows.Add(values);
        row = ResultCursor.NextRow();
    }
}

清除按钮

//清除
private void btnClear_Click(object sender, EventArgs e)
{
    txtSelectResult.Clear();
}

字段列表和唯一值列表中双击属性事件

//在字段列表中双击属性字段名称时发生
private void ListBoxFields_MouseDoubleClick(object sender, MouseEventArgs e)
{
    //在结果中添加字段的名称
    currentFileName = ListBoxFields.Text;
    txtSelectResult.Text += currentFileName;
}

//字段值列表中双击添加
private void ListBoxValues_MouseDoubleClick(object sender, MouseEventArgs e)
{
    txtSelectResult.Text += ListBoxValues.Text;
}

主界面窗体调用属性查询窗体

private void queryToolStripMenuItem_Click(object sender, EventArgs e)
{
    //创建新建属性查询窗体
    AttributeQueryForm frmQureyByAttribute = new AttributeQueryForm();
    //将当前主窗体的MapControl控件中的Map对象赋值给FormQueryByAttribute窗体的CurrentMap属性
    frmQureyByAttribute.currentMap = this.axMapControl1.Map;
    //显示属性查询窗体
    frmQureyByAttribute.Show();
}

结果

按属性查询

加载地图

对“World Cities”图层进行属性查询。

image-20230403224746487

选择图层

image-20230403230228622

选择字段

image-20230403230055559

选择唯一值

image-20230403230117930

查询结果

image-20230403230136119

标签:sender,Text,void,object,private,查询,图层,ArcEngine,属性
From: https://www.cnblogs.com/tangjielin/p/17284860.html

相关文章

  • Django笔记十五之in查询及date日期相关过滤操作
    这一篇介绍关于范围,日期的筛选inrangedateyearweekweekdayquarterhour1、inin对应于MySQL中的in操作,可以接受数组、元组等类型数据作为参数:Blog.objects.filter(id__in=[1,2,3])对应的SQL是:select*fromblog_blogwhereidin(1,2,3);字符串也可以作......
  • DQL分组查询
    DQL分组查询:1.语法:select字段列表from表名[where条件]groupby分组字段名[having分组后过滤条件];where和having的区别:执行时机不同:where是分组之前进行过滤,不满足wehere条件,不参与分组;而having是分组之后对结果进行过滤判断条件不同:where不能对聚合函数进行判断......
  • Spring 类型转换详解,SpringBean创建时属性类型转换源码详解
    文章目录一、概述1、Spring类型转换的实现2、使用场景3、源码分析二、基于JavaBeans接口的类型转换1、代码实例2、Spring內建PropertyEditor扩展ByteArrayPropertyEditor3、自定义PropertyEditor扩展整合到springframework代码实例SpringPropertyEditor的设计缺陷三、Spr......
  • 【第27天】SQL进阶-查询优化- performance_schema系列实战三:锁问题排查(表级锁)(SQL 小虚
    回城传送–》《32天SQL筑基》文章目录零、前言一、什么是表级锁二、什么时候适合加表级锁三、实战演练3.1数据准备(如果已有数据可跳过此操作)3.2开启第一个会话,执行显式加表级锁3.3开启第二个会话,对该表执行update更新3.4开启第三个会话,查询线程信息3.5分析3.6释放第一个会话......
  • DQL查询
    DQL基本查询1.查询多个字段select字段1,字段2,字段3...from表名;select*from表名;2.设置别名select字段1[as别名],字段2[as别名],字段3[as别名]...from表名;3.去除重复记录selectdistinct字段列表from表名;DQL条件查询:select字段列表from表名......
  • vue指令之属性指令
    目录属性指令示例属性指令标签上的属性可以绑定变量,变量变化,属性也会变化#什么是属性?比如:href/src/name/value/class/style...语法:v-bind:属性名="变量名"简写:属性名="变量名"示例<body><divid="app"><av-bind:href="url">点我</a>......
  • JS Iterator属性
    Iterator的作用:为各种数据结构,提供一个统一的、便捷的访问接口使得数据结构的成员能够按照某种次序排列es6创造了一种新的遍历命令for...of循环,Iterator主要供for...of循环ES6规定,默认的Iterator接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有S......
  • 【功能与技巧】promethues通过记录规则持久化查询,存储rules表达式查询结果为采集指标
    一、查询持续性到目前为止,我们只是在表达式浏览器中运行查询。虽然查看该查询的输出很方便,但结果仍然是临时存储在Prometheus服务器上,我们可以通过以下三种方式使查询持久化: *记录规则:根据查询创建新指标*报警规则:从查询生成警报*可视化:使用Grafana等仪表板可视化查询......
  • OUI查询(MAC地址厂商查询)
    IEEEOUIhttps://standards-oui.ieee.org/MAC地址查询-在线工具https://itool.co/mac查询MAC地址厂商信息、制造商名称......
  • CSS文本属性(文本颜色、文本对齐、装饰文本、文本缩进、行间距)
    本博文介绍CSS中常用的文本属性,包括文本颜色、文本对齐、装饰文本、文本缩进和行间距。属性说明属性值color文本颜色颜色(如red、green)#十六进制(如#ff0000)rgb代码(如rgb(255,0,0))text-align文本对齐left(默认值,左对齐)right(右对齐)center(水平居中)text-decora......