给TOCControl控件添加右键菜单实现查看属性表

添加右键菜单

添加右键菜单的原理很简单,通过TOCControl控件的OnMouseDown事件获取鼠标的点击位置,然后在该位置上显示右键菜单即可
具体操作如下

private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
{
   try
   {
       if (e.button == 2)           // 判断是不是右键点击; 1是左键,2是右键
       {
           // 存储所点击的要素类型
           esriTOCControlItem pItem = esriTOCControlItem.esriTOCControlItemNone;
           // 地图对象
           IBasicMap pMap = null;
           // 图层对象
           ILayer pLayer = null;
           object unk = null;
           object data = null;
           // 以引用的方式传递参数,方便将值带出来
           axTOCControl1.HitTest(e.x, e.y, ref pItem, ref pMap, ref pLayer, ref unk, ref data);
           // 点击的要素图层;只是为了让读者知道该变量的类型,所以定义为局部变量,本来不应该在这里定义的,建议定义为全局变量,否则的话右键菜单的选项无法使用该图层的有关信息
           IFeatureLayer pTocFeatureLayer = pLayer as IFeatureLayer;
           // 判断是否是图层要素
           if (pItem == esriTOCControlItem.esriTOCControlItemLayer && pTocFeatureLayer != null)
           {
               // 打开右键菜单,参数为当前鼠标的位置
               contextMenuStrip1.Show(Control.MousePosition);
           }
       }
       
   }
   catch (Exception ex)
   {
       MessageBox.Show(ex.Message);
   }
}

总结一下这一步的作用:
首先在鼠标右键点击的地方显示出了右键菜单,其次,获取到了所选图层的实例对象,便于在右键菜单中对图层进行查询或者编辑。

打开属性表

打开属性表的思路也很简单,下面详细阐述一下:
1.其实属性表本质上也是一个窗体,所以打开属性表其实就是打开一个新的窗体。所以我们要创建一个新的窗体

  • 向窗体中添加一个DataGridView控件

给TOCControl控件添加右键菜单实现查看属性表_第1张图片

  • 初始化窗体(InitUI()函数 )

下面说一下如何代码实现:

    public partial class Attribute_Form : Form
    {
        public Attribute_Form()
        {
            InitializeComponent();
        }
        //要查询的属性图层
        private IFeatureLayer _curFeatureLayer;
        public IFeatureLayer CurFeatureLayer
        {
            get { return _curFeatureLayer; }
            set { _curFeatureLayer = value; }
        }


        public void InitUI()
        {
            if (_curFeatureLayer == null) return;

            IFeature pFeature = null;
            DataTable pFeatDT = new DataTable(); //创建数据表
            DataRow pDataRow = null; //数据表行变量
            DataColumn pDataCol = null; //数据表列变量
            IField pField = null;
            for (int i = 0; i < _curFeatureLayer.FeatureClass.Fields.FieldCount; i++)
            {
                pDataCol = new DataColumn();
                pField = _curFeatureLayer.FeatureClass.Fields.get_Field(i);
                pDataCol.ColumnName = pField.AliasName; //获取字段名作为列标题
                pDataCol.DataType = Type.GetType("System.Object");//定义列字段类型
                pFeatDT.Columns.Add(pDataCol); //在数据表中添加字段信息
            }

			// 获取游标,遍历数据并填充至数据表
            IFeatureCursor pFeatureCursor = _curFeatureLayer.Search(null, true);
            while ((pFeature = pFeatureCursor.NextFeature()) != null)
            {
            	// 创建新行
                pDataRow = pFeatDT.NewRow();
                //获取每一行字段属性
                for (int k = 0; k < pFeatDT.Columns.Count; k++)
                {
                    pDataRow[k] = pFeature.get_Value(k);
                }

                pFeatDT.Rows.Add(pDataRow); //在数据表中添加字段属性信息

            }
            //释放指针
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);

            //dataGridAttribute.BeginInit();
            dataGridView_attr.DataSource = pFeatDT;
            //dataGridAttribute.EndInit();
        }
    }

2.定义好了属性表窗体之后就很简单了,只需要在用户点击“打开属性表”菜单的时候显示该窗体即可(记得将图层对象传递给属性表窗体,否则没法显示)
代码很简单:

private void 打开属性表ToolStripMenuItem_Click(object sender, EventArgs e)
{
	// frmAttribute是类里面定义的全局变量,也就是属性表窗体
    if (frmAttribute == null || frmAttribute.IsDisposed)
    {
        frmAttribute = new Attribute_Form();
    }
    // 一定要记得将要素图层赋值给属性表窗体
    frmAttribute.CurFeatureLayer = pTocFeatureLayer;
    // 初始化窗体
    frmAttribute.InitUI();
    // 显示窗体
    frmAttribute.ShowDialog();
}

你可能感兴趣的:(C#,ArcGIS,Egine开发)