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,小白。