在TOC中添加"右键查看属性信息"菜单

首先添加一个新窗口frmAttribute,然后添加一个dataGridView控件dataGridView1。
然后在主窗口添加一个ContextMenuStrip控件,并添加子菜单“属性表”。
(1)首先,在新窗体对应的类中,我们创建 frmAttribute 类,即存储 属性信息 的对话框

        private AxMapControl m_Mapctr;    

        private ILayer m_pLyr;

 

        public frmAttribute(AxMapControl pMapCtr,ILayer pLyr)   //该类创建时,接受参数 "所在地图(pMapCtr)","所在图层(pLyr)"
        {
            InitializeComponent();
            m_Mapctr = pMapCtr;
            m_pLyr = pLyr;
        }

        private void frmAttribute_Load(object sender, EventArgs e)
        {
            try
            {
                ILayer pLayer;
                pLayer = m_pLyr;
                IFeatureLayer pFLayer = pLayer as IFeatureLayer;
                IFeatureClass pFC = pFLayer.FeatureClass;

                ILayerFields pLayerFields = pFLayer as ILayerFields;
                DataSet ds = new DataSet("dsTest");
                DataTable dt = new DataTable(pFLayer.Name);
                //获取列名
                DataColumn dc = null;
                for (int i = 0; i < pLayerFields.FieldCount; i++)
                {
                    dc = new DataColumn(pLayerFields.get_Field(i).Name);
                    dt.Columns.Add(dc);
                    dc = null;
                }

                //获取属性表

                IFeatureCursor pFCursor = pFC.Search(null, false);
                IFeature pFeature = pFCursor.NextFeature();
                while (pFeature != null)
                {
                    DataRow dr = dt.NewRow();

                    for (int j = 0; j < pLayerFields.FieldCount; j++)
                    {
                        if (pLayerFields.FindField(pFC.ShapeFieldName) == j)
                        {
                            dr[j] = pFC.ShapeType.ToString();
                        }
                        else
                        {
                            dr[j] = pFeature.get_Value(j).ToString();
                        }
                    }
                    dt.Rows.Add(dr);

                    pFeature = pFCursor.NextFeature();
                }

                //显示信息

                dataGridView1.DataSource = dt; //dataGridView1 是在新窗体中新增的dataGridView控件
            }
            catch(Exception exception)
            {
                MessageBox.Show("读取属性表失败:" + exception.Message);
            }

        }

 

(2) 然后在主窗体form1程序中,TOC 的右键菜单弹出时,记录选择的信息:

        //为了配合toc右键菜单
        private esriTOCControlItem toccItem = esriTOCControlItem.esriTOCControlItemNone;
        private IBasicMap pBasicMap = null;

        private ILayer pLayer = null;
        IFeatureLayer pFLayer;
        IFeatureClass pFC;
 

 

        //点击toc的图层时弹出右键菜单

        private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
        {
            object unk = null;
            object data = null;
            if (e.button == 2)
            {

                //这个函数最为关键,它找到了鼠标点击 "位置(e.x , e.x.y)" "图层(pLayer)" "类型(toccItem )"
                axTOCControl1.HitTest(e.x, e.y, ref toccItem, ref pBasicMap, ref pLayer, ref unk, ref data);      
                if (toccItem == esriTOCControlItem.esriTOCControlItemLayer)
                {
                    pFLayer = pLayer as IFeatureLayer;
                    pFC = pFLayer.FeatureClass;
                    contextMenuStrip2.Show(axTOCControl1, new System.Drawing.Point(e.x, e.y));
                }
                else if (toccItem == esriTOCControlItem.esriTOCControlItemMap)
                {
                    contextMenuStrip2.Show(axTOCControl1, new System.Drawing.Point(e.x, e.y));
                }
            }
        }

      补充:private esriTOCControlItem toccItem = esriTOCControlItem.esriTOCControlItemNone;

      这里的 toccItem  有很多类型:  esriTOCControlItemHeading(标题处)  ,  esriTOCControlItemMap(地图名称处)  ,

                                               esriTOCControlItemLayer(图层名称处)  ,  esriTOCControlItemLegendClass(图层图例处)   ,                

                                               esriTOCControlItemNone(TOC中heading,map,layer,legend之外所剩余的空白区域)

 

(3)最后一步,在 Form1 中创建 frmAttribute 实例:

        private void 属性ToolStripMenuItem_Click(object sender, EventArgs e)//在Toc上打开属性窗口
        {
            frmAttribute frm = new frmAttribute(axMapControl1,pLayer);
            frm.ShowDialog();
        }

 

这个过程我觉得应该是算描述得十分详细了,希望对初学者有用!


posted @ 2008-11-09 15:26  周文  阅读(687)  评论(0编辑  收藏  举报