C#+AE使用中文别名实现属性查询功能

最近正在做二次开发,要用到属性查询功能,如下图Arcgis中的按属性选择,做一个类似的功能。在我们建立地理数据库的时候,为了规范化和标准化,一般字段名都是使用英文名或者字母,而别名(AliasName)用中文。在查询的时候都是英文字段名,不易于理解,还需要对照字段表来查看,很麻烦。

C#+AE使用中文别名实现属性查询功能_第1张图片

在GIS开发中,对有关字段显示的功能都显示成中文,其实只需要用field.AliasName就能显示,但是对应的功能就失效了,只有用Name时才能实现,而Name又是英文的,怎么办呢?网上查了很多,也没有类似的解决方法,自己花了几天时间研究下,想到用字典(Dictionary)的方式来将Name和AliasName替换。接下来细讲下,其实很简单。

第一步:声明一个字典全局变量,用来存储name和aliasName

Dictionary dictionary;

第二步:dictionary实例化,并向字典中添加别名和原字段名:dictionary.Add(field.AliasName, field.Name);

//在图层名称下拉框控件中所选择图层发生改变时触发事件,执行本函数
private void comboBoxLayerName_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; j < compositeLayer.Count; j++)
               {
                  //判断图层的名称是否与comboBoxLayerName控件中选择的图层名称相同
                  if (compositeLayer.get_Layer(j).Name == 
                            comboBoxLayerName.SelectedItem.ToString())
                   {
                    //如果相同则设置为整个窗体所使用的IFeatureLayer接口对象
                 currentFeatureLayer = compositeLayer.get_Layer(j) as IFeatureLayer;
                     break;
                  }
                }
           }
           else
           {
                //判断图层的名称是否与comboBoxLayerName中选择的图层名称相同
                 if (currentMap.get_Layer(i).Name == 
                    comboBoxLayerName.SelectedItem.ToString())
                 {
                     //如果相同则设置为整个窗体所使用的IFeatureLayer接口对象
                      currentFeatureLayer = currentMap.get_Layer(i) as IFeatureLayer;
                        break;
                 }
                }
            }

            dictionary = new Dictionary();
            //使用IFeatureClass接口对该图层的所有属性字段进行遍历,并填充listBoxFields控件
            for (int i = 0; i < currentFeatureLayer.FeatureClass.Fields.FieldCount; 
             i++)
            {
                //根据索引值获取图层的字段
                field = currentFeatureLayer.FeatureClass.Fields.get_Field(i);
                //dictionary = new Dictionary();
                //排除SHAPE字段,并在其它字段名称前后添加字符"和字符"
                if (field.Name.ToUpper() != "SHAPE")
                {                    
                    listBoxFields.Items.Add("[" + field.AliasName + "]");
                    dictionary.Add(field.AliasName, field.Name);
                }

                    
            }

            //更新labelwhere控件中的图层名称信息
            labelwhere.Text = currentFeatureLayer.Name + " WHERE:";

            //将显示where语句的文本框内容清空
            textBoxWhere.Clear();
        }

第三步:在 执行属性查询时,获取的是文本框中的内容,即 textBoxWhere.Text。

所以在查询前用正则表达式获取将name和AliasName互换;把汉字字符串切出来之后,通过判断字典里key集合里有没有包含这个汉字字符串(AliasName),如果包含的话,就获取字典里对应name,将两者替换。这样查询功能就能实现,核心代码如下:

   //设置where语句内容
            string s = textBoxWhere.Text;
            Regex reg = new Regex("[\u4e00-\u9fa5]+");
            MatchCollection c = reg.Matches(s);
            for (int i = 0; i < c.Count; i++)
            {
                if (dictionary.Keys.Contains(c[i].ToString()))
                {
                    string aliasName = c[i].ToString();
                    string name = dictionary[aliasName];
                    s = s.Replace(aliasName, name);
                }
            }

            queryFilter.WhereClause = s;

 最终实现的效果如图所示,可以用中文别名进行属性查询。

C#+AE使用中文别名实现属性查询功能_第2张图片

举一反三,在很多功能中,只要是关于字段属性操作的,都可以用这些核心代码将Name与AliasName关联替换,实现中文操作功能。

你可能感兴趣的:(C#+AE二次开发)