ArcGIS Server 开发系列(五)自定义 Toolbar 工具2 (转载于Flyingis)

这段代码最关键的类是CallbackResult,它简化了web adf framework中客户端回调的处理,不用再创建自己的客户端和服务器端逻辑,使用CallbackResult就可以将信息传回客户端,更新客户端页面的内容、图片或执行js脚本。关于CallbackResult构造方法第三个参数,下面js代码写的很详细:
if (action=="content") {
o = document.getElementById(actions[1]);
if (o != null)
{
o.outerHTML=actions[3];
}
}
else if (action=="innercontent") {
o = document.getElementById(actions[1]);
if (o != null)
{
o.innerHTML=actions[3];
}
}
else if (action=="image")
{
o = document.images[actions[1]];
if (o != null)
{
o.src = actions[3];
}
else alert (actions[1] + " was null");
}
else if (action=="javascript") {
eval(actions[3]);
}

    4.填充DropDownList

    DropDownList显示的是ArcGIS Server Internet地图数据源所包含的图层名称,选择哪个图层,矩选时就对哪个图层进行查询,DropDownList的填充在Page_PreRender过程中。
if (!IsPostBack)
{
    ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)Map1.GetFunctionality(1);

    ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = mf.Resource;
    bool supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));

    if (supported)
    {
        ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);

        string[] lids;
        string[] lnames;
        qfunc.GetQueryableLayers(null, out lids, out lnames);
        for (int i = 0; i < lnames.Length; i++)
        {
            LayerDropDownList1.Items.Add(lnames[i]);
        }
        Session["TargetLayer"] = LayerDropDownList1.Items[0].Value;
    }
}

    5.实现ICallbackEventHandler接口

    Default.aspx.cs的_Default实现ICallbackEventHandler接口,在类中实现RaiseCallbackEvent和GetCallbackResult两个方法,做ASP.Net 2.0的对ICallbackEventHandler应该是再熟悉不过了:)但下来框显示图层为什么要用到callback?
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Session["TargetLayer"] = "";
    }
    LayerDropDownList1.Attributes.Add("onchange", "ChangeLayer()");
    sADFCallBackFunctionInvocation = Page.ClientScript.GetCallbackEventReference(this, "message", "processCallbackResult", "context", "postBackError", true);
}

public void ChangeDropDownListServer(string ea)
{
    char[] parser_char = { ',' };
    string[] messages = ea.Split(parser_char);
    string dll1 = messages[1];
    Session["TargetLayer"] = dll1;
}

ICallbackEventHandler 成员#region ICallbackEventHandler 成员
public void RaiseCallbackEvent(string eventArgument)
{
    if (eventArgument.Contains("ddl1"))
    {
    ChangeDropDownListServer(eventArgument);
    }
}
public string GetCallbackResult()
{
    return returnstring;
}

    原因就在这里,改变Session ["TargetLayer"]的值,SelectFeatures需要知道是对哪个图层进行查询的,从而对在那个图层选择要素进行高亮及属性显示,这里 callback仅仅是在做了变量值的处理。最后在页面之间加入js脚本ChangeLayer()。
<script type="text/javascript" language="javascript">
var context;
function ChangeLayer()
{
    var message;
    var ddl1value = document.getElementById('LayerDropDownList1').value;
    message = 'ddl1';
    message += ',' + ddl1value;
    <%=sADFCallBackFunctionInvocation%>
}
</script>

    运行程序:


    其中黄色区域就是Select Features按钮矩选的要素,下方gridview显示了查询到的属性结果。

    程序中有两个地方用到了异步刷新,一个是ASP.Net 2.0原有接口ICallbackEventHandler,另一个是Web ADF framework的CallbackResult类,最初认为简单异步刷新用自己写的XMLHttpRequest请求更为简单,如上例中对 session存储值的改变,不用ICallbackEventHandler,但是在server地图互操作的过程中, ICallbackEventHandler给我们提供了更多的便利。

继续思考:

    1.本例实现了根据地图查询属性,反过来根据属性查询几何图形怎么实现呢?其实前面《ArcGIS Server 开发系列(三)--漫游 Graphics data sources》已经讲到了,只不过需要将条件查询的信息,更改为在gridview或其他地方选择的属性信息,然后高亮显示相应的几何要素。

    2.这种几何要素图形和属性信息的关联可以应用于各种不同的业务需求中,如图形和属性的同步删除、位置定位、类似结果查询等等。

    3.如何改进或提升这种图形和属性的异步刷新带来的用户体验?

作者:Flyingis 

原文地址:https://www.cnblogs.com/googlegis/p/2979048.html