ArcGIS Server 9.3 ADF 右键菜单的单击事件的响应问题

  有些日子没写博客了,最近想写一个关于页面周期的博客但是由于我的理论知识不够,对页面周期还没太了解透,在没有时间进一步了解的情况下,我就不出来丢人了。

  

  下面切入正题,这几天准备在项目里添加一个地图控件的右键菜单,无奈在页面刷新过后右键菜单就失效了,进不去click事件,只能进CustomJavascript方法里,百度谷歌泡了几天也没找到解决办法,最后我在刘光的书上看到他对contextmenu有这么一段说明:“要注意的是,contextmenu控件生成的回调响应规定由web adf javascript来处理,因此,如果页面中其他控件的内容改变必须打包成callbackresults,并加入到contextmenu的callbackresults属性中。”

  就是这句话让我茅塞顿开,因为我进不去click事件的方法里都有别的控件的的回调方法,用来向服务器返回请求获取响应。这就代表着我要把原来写的用map控件生成的回调用contextmenu代替,这样的话这些事都成了contextmenu做的了,他应该不会生气罢工了,呵呵,气氛好紧张,我开个玩笑舒缓下。

  至于为什么会有这样的规定,我也不知道,因为我没有看这两个类的底层代码,不知道esri这样做是处于何种目的。

 

  文字写的慢,意思也难以表达出来,下面还是我一贯的做法,贴点代码吧,方便跟我一样的小白轻松了解。

前台代码:

<%--右键菜单130815--%>        
        <esri:ContextMenu ID="ContextMenu1" runat="server" BackColor="White" OnItemClicked="ContextMenu1_ItemClicked" />

后台代码:

ContextMenu1.Items.Clear();
                ESRI.ArcGIS.ADF.Web.UI.WebControls.ContextMenuItem fullextMenuItem = new ESRI.ArcGIS.ADF.Web.UI.WebControls.ContextMenuItem("images/fullextent.jpg", "全图", null);
                ESRI.ArcGIS.ADF.Web.UI.WebControls.ContextMenuItem saveMenuItem = new ESRI.ArcGIS.ADF.Web.UI.WebControls.ContextMenuItem("images/save.jpg", "截图", null);
                ESRI.ArcGIS.ADF.Web.UI.WebControls.ContextMenuItem dialogueMenuItem = new ESRI.ArcGIS.ADF.Web.UI.WebControls.ContextMenuItem("images/04.png", "显示结果", null);
                //fullextMenuItem.CustomJavascript = "contextMenuClick('" + fullextMenuItem.Text + "')";
                //saveMenuItem.CustomJavascript = "contextMenuClick('" + saveMenuItem.Text + "')";
                dialogueMenuItem.CustomJavascript = "contextMenuClick('" + dialogueMenuItem.Text + "')";
                ContextMenu1.Items.Add(fullextMenuItem);
                ContextMenu1.Items.Add(saveMenuItem);
                ContextMenu1.Items.Add(dialogueMenuItem);

                string format = "esriShowContextMenu(event,'{0}','{1}','{2}');return false;";
                string showContextMenu = string.Format(format, ContextMenu1.ClientID, Map1.UniqueID, "");
                Map1.Attributes.Add("oncontextmenu", showContextMenu);

这里我就贴出click事件的代码,里面的具体代码网上很多,我就不贴出来了

protected void ContextMenu1_ItemClicked(object sender, ESRI.ArcGIS.ADF.Web.UI.WebControls.ContextMenuItemEventArgs args)
        {
            switch (args.Item.Text)
            {
                case "全图":
                    {
                        MapHelper.ShowToolPanel(Map1);
                        ContextMenu1.CallbackResults.CopyFrom(Map1.CallbackResults);
                        break;
                    }
                case "截图":
                    {
                        MapHelper.SaveAsPicture(Map1);
                        ContextMenu1.CallbackResults.CopyFrom(Map1.CallbackResults);
                        break;
                    }
            }

        }

下面是替换回调:

CallbackResult cr1 = new CallbackResult(null, null, "javascript", oa);
            Map1.CallbackResults.Add(cr1);

注意这里一般情况下如果项目里我们没有添加contextmenu的话那就肯定用Map1来生成的回调向服务器提交数据,但是项目里有了contextmenu后这么做就会影响到contextmenu,故而这里要改成Contextmenu1,写成 ContextMenu1.CallbackResults.Add(cr1);

其他出现Map1.CallbackResults或者Map1.CallbackResults.ToString()的地方也要先添加这句ContextMenu1.CallbackResults.CopyFrom(Map1.CallbackResults);用来完成转换,然后把原来出现Map1.CallbackResults的地方替换成ContextMenu1.CallbackResults。

  然后你再编译运行,当你使用了原来是Map1回调处理的方法后就不会再发生click事件失去响应的问题了。如果你还有什么不懂得请加webgis开发群208785427,跟我们一起交流,by thsgar,小白。

posted @ 2013-08-20 18:51  thsgar  阅读(784)  评论(0编辑  收藏  举报