您的位置:首页 > 其它

Arcgis Server 9.2控件刷新问题

2008-04-02 14:03 260 查看
1)arcgis server 9.2 开始为解决有map页面的局部刷新问题,在asp net 2.0 callback机制的基础上扩充引入了esri-ajax机制,基本上所有与map 有关的控件如map,toc,taskresult等均引入了esri-ajax,这样在有这些esri-ajax机制的esri控件的页面中,原asp.net显示控件涮新方法不能再使用原服务器端的refresh,应由client与server端的互动才行。
(2)mircosoft为解决asp net 2.0 callback机制的难用问题,后推出了ms ajax extention 1.0,使得asp net上的ajax实现大为简单,可惜arcgis server 9.2是在ms ajax extention 1.0(http://asp.net/ajax/downloads/default.aspx)推出前的产品,不支持它,arcgis server 9.3会支持ms ajax extention技术,目前要实现有esri控件与原aspnet 2.0控件页面的全部局部涮新,需同时使用ms ajax与esri asjx,它们的共存是没有问题的(Using ASP.NET AJAX with the Web ADF,见 http://blogs.esri.com/Dev/blogs/ ... th-the-Web-ADF.aspx),我已在一个完整的web gis环境中使用过了,效果与稳定性均令人满意。

(3)如何在esri-ajax环境中涮新asp.net显示控件呢,使用下面的通用方法:
private CallbackResult RefreshControlHtml(Control control)
{

System.IO.StringWriter sw = new System.IO.StringWriter();

HtmlTextWriter writer = new HtmlTextWriter(sw);

control.RenderControl(writer);

string htmlContent = sw.ToString();

sw.Close();

return new CallbackResult(control, "content", htmlContent);

}

在gridview,listbox,label等asp.net显示控件需涮新时,调用:

map1.CallbackResults.Add(RefreshControlHtml(mygridview1));
或 map1.CallbackResults.Add(RefreshControlHtml(mylistbox1));等
-------------------------------------------------------------------------------------------------------------------------------
为示范起见,我贴部分代码。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using ESRI.ArcGIS.ADF.Web.UI.WebControls;
using ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools;
using ESRI.ArcGIS.ADF.Web;
using ESRI.ArcGIS.ADF;
using System.Collections;
using ESRI.ArcGIS.ADF.Web.Display.Graphics;
using ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer;
using ESRI.ArcGIS.ADF.ArcGISServer;

/// <summary>
/// Command_wsh3 的摘要说明
/// </summary>

public class Command_wsh3 : IMapServerCommandAction
{
public void ServerAction(ToolbarItemInfo info)
{
Map mapctrl = (Map)info.BuddyControls[0];

// 0. 找到 查询条件定义控件
FloatingPanel myfloatingpanel = (FloatingPanel) mapctrl.Page.FindControl("FloatingPanel1");
DropDownList mydroplist1 = (DropDownList)myfloatingpanel.FindControl("DropDownList1");
int myDropindexVlaue = mydroplist1.SelectedIndex;

string jsfunction = string.Format("alert('My Result:{0}');", myDropindexVlaue.ToString());
CallbackResult showcr = new CallbackResult(null, null, "javascript", jsfunction);
mapctrl.CallbackResults.Add(showcr);

// 1.用query方法得到datatable

System.Data.DataTable qdatatable=new DataTable();

IEnumerable func_enum = mapctrl.GetFunctionalities();
foreach (ESRI.ArcGIS.ADF.Web.DataSources.IGISFunctionality gisfunctionality in func_enum)
{
ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = gisfunctionality.Resource;
bool supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));

if (supported)
{
ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc;
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);

ESRI.ArcGIS.ADF.Web.Geometry.Envelope env = new ESRI.ArcGIS.ADF.Web.Geometry.Envelope(-100, -100, 100, 100);
env = mapctrl.Extent;

ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
spatialfilter.Geometry = env;
spatialfilter.ReturnADFGeometries = true;
spatialfilter.MaxRecords = 1000;

for (int i = 0; i < lids.Length; i++)

{
// if (i == 1) // 主要机构
if ( i== 1 )
{
qdatatable = qfunc.Query(null, lids, spatialfilter);
// qdatatable.TableName = gisresource.Name + "_" + lnames;
qdatatable.TableName = lnames + " (当前区域: " + qdatatable.Rows.Count.ToString() + ")";

}
}
}
}
// 2 在datatable中加入一个LINK字段指示详情

// 3 把 datatable Converter To GraphicsLayer
// 4 把GraphicsLayer中的IsSelectedColumn字段set true

// 5 把 graphicsLayer 加载 到 mapresource

// 6 refresh map

if (mapctrl.ImageBlendingMode == ImageBlendingMode.WebTier)
{
mapctrl.Refresh();
}
else
if (mapctrl.ImageBlendingMode == ImageBlendingMode.Browser)
{
mapctrl.RefreshResource(gResource.Name);

}

// 7- 把dataset放入 taskresult

// 8- 刷新taskresult

myTaskResults.Refresh();
foreach (CallbackResult cr in myTaskResults.CallbackResults)
{
mapctrl.CallbackResults.Add(cr);
}

// 9 - 用 gridview 显示 graphicsLayer

GridView mygridview1 = (GridView)mapctrl.Page.FindControl("GridView1");
mygridview1.DataSource = graphicsLayer;
mygridview1.DataBind();

mapctrl.CallbackResults.Add(RefreshControlHtml(mygridview1));

TextBox mytextbox = (TextBox)mapctrl.Page.FindControl("TextBox1");

mytextbox.Text = "当前区域:" + qdatatable.Rows.Count.ToString();
mapctrl.CallbackResults.Add(RefreshControlHtml(mytextbox));

}
private CallbackResult RefreshControlHtml(Control control)
{

System.IO.StringWriter sw = new System.IO.StringWriter();

HtmlTextWriter writer = new HtmlTextWriter(sw);

control.RenderControl(writer);

string htmlContent = sw.ToString();

sw.Close();

return new CallbackResult(control, "content", htmlContent);

}

}

备注:本文引用自http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=21616&highlight=ArcGIS%2BServer%2B9.2(需是ESRI论坛的注册用户才能访问网页)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: