关于自定义任务(Tasks)的心得

1、类简介
在ADF中,提供了任务管理器控件(TaskManager)以及任务结果控件(TaskResults)。任务管理器控件可以容纳ADF中提供的一系列任务控件(如:SearchAttributesTask/QueryAttributesTask/FindPlaceTask/FindAddressTask/GeoprocessingTask/EditorTask),我们自定义的任务控件也可以放置在内。
自定义任务控件一般是从任务抽象类(Task或者FloatingPanelTask)继承而来。FloatingPanelTask与Task的相同之处在于它们都是从System.Web.UI.WebControls.CompositeControl继承而来,而System.Web.UI.WebControls.CompositeControl实现了ICallbackEventHandler接口,所以它们都具有Ajax能力。
FloatingPanelTask与Task的区别在于是否被包含在FloatingPanel中。所以以下重点谈谈任务抽象类Task。Task类除了实现ICallbackEventHandler外,还实现了二个接口:IBuddyControlSupport以及ITask。
(1)IBuddyControlSupport接口定义了方法GetSupportedBuddyControlTypes,来说明任务绑定的空间类型。如OverviewMap控件绑定Map, Toolbar控件绑定Map以及PageLayout控件。我们如果对Map操作,则可以使用如下代码:
public Type[] GetSupportedBuddyControlTypes() {return new Type[] { typeof(Map) };}
(2)ITask接口
主要属性以及方法
object Input { get; set;}
提交前后的参数。由于Task继承于CompositeControl,因此会将变量参数内容存储在变量_callbackArg中。所以一般在GetCallbackResult()中会利用_callbackArg生成Input内容。所生成的生成Input内容一般在ExecuteTask()中进行使用。
object Results { get;set;}
    任务所生成的结果。一般在ExecuteTask()中生成。在类FloatingPanelTask中方法GetCallbackResult()中会调用DisplayResults(taskJobID, Input, Results),而DisplayResults则对任务结果控件进行结果遍历显示resultsContainer.DisplayResults(this, jobID, taskInput, taskResults);
CallbackResultCollection CallbackResults { get;}
回调结果集合。在DisplayResults(taskJobID, Input, Results)调用任务结果控件进行结果遍历显示后,会执行CallbackResults.CopyFrom(resultsContainer.CallbackResults)来进行回调登记。在类FloatingPanelTask中方法GetCallbackResult()中会执行CallbackResults.ToString()来产生下一次回调内容。
除了实现以上两个接口的内容外,自定义任务很重要的一个方法是CreateChildControls()方法。为了将子控件增加到控件集合中去,必须重写受保护的CreateChildControls()方法。在这个方法中,我们使用Controls.Add()方法添加每个子控件到控件树中。当然,为了避免子控件与页面其他控件之间的命名冲突,我们使用INamingContainer接口。

2、示例Common_CustomTask_CSharp简说
(1)在CreateChildControls ()中有关任务执行按钮的代码:
string argument = string.Format("'bufferdistance=' + document.getElementById('{0}').value", distanceInput.ClientID);
string onClick = string.Format("executeTask({0},\"{1}\");", argument, CallbackFunctionString);
button.Attributes.Add("onclick", onClick);
在这里,按钮的Click事件激发了executeTask方法。产生的参数如下:
WebForm_DoCallback('TaskManager1$SimpleTask_CSharp1',argument,processCallbackResult,context,postBackError,true)");"
executeTask方法存在于display_task.js中。以下为相关代码:
var taskJobIDCounter = 0;

function executeTask(callbackArguments, callbackFunctionString, taskJobID)
{
    if (taskJobID == null)
    {
        taskJobIDCounter++;
        taskJobID = taskJobIDCounter;
    }
   
    startActivityIndicator(callbackArguments, callbackFunctionString, taskJobID);
    var tmp="startJob(\"" + callbackArguments.replace('\"','\\"') + "\",\"" + callbackFunctionString + "\"" + "," + taskJobID + ")";
    window.setTimeout(tmp,1000);
}

function startActivityIndicator(callbackArguments, callbackFunctionString, taskJobID)
{   
    var argument = "EventArg=startTaskActivityIndicator&taskJobID=" + taskJobID;
    if (callbackArguments.length > 0) argument += "&" + callbackArguments;
var context = null;
//发出WebForm_DoCallback调用,
//argument为"EventArg=startTaskActivityIndicator&taskJobID="+taskJobID; +callbackArguments
    eval(callbackFunctionString);
}

function startJob(callbackArguments, callbackFunctionString, taskJobID)
{
    var argument = "EventArg=executeTask&taskJobID=" + taskJobID;
    if (callbackArguments.length > 0) argument += "&" + callbackArguments;
        var context = null;
//发出WebForm_DoCallback调用,
//argument为"EventArg=executeTask&taskJobID=" + taskJobID;"+ callbackArguments
        eval(callbackFunctionString);
}
很显然,display_task.js中的executeTask()方法引起了Ajax形式的CallBack。产生的字符串为"EventArg=executeTask&taskJobID=2& bufferdistance=10"
  (2)由于Task继承于CompositeControl,因此会将变量参数内容存储在变量_callbackArg中。一般在GetCallbackResult()中会利用_callbackArg生成Input内容。
NameValueCollection keyValColl = CallbackUtility.ParseStringIntoNameValueCollection(_callbackArg);
if (keyValColl["EventArg"] == "executeTask")
{
     string sDistance = keyValColl["bufferdistance"];
      float fDistance;
      float.TryParse(sDistance, out fDistance);
      object[] inputs = new object[2];
      inputs[0] = fDistance;
      ElementGraphicsLayer clonedLayer = GraphicsLayer.Clone() as ElementGraphicsLayer;
      foreach (DataRow row in GraphicsLayer.Rows) clonedLayer.ImportRow(row);
     inputs[1] = clonedLayer;
      GraphicsLayer.Clear();
     input = inputs;
}
(3)所生成的生成Input内容一般在ExecuteTask()中进行使用。
object[] inputs = Input as object[];
//buffer distance
float bufferdistance = (float)inputs[0];
if (float.IsNaN(bufferdistance)) bufferdistance = 0.0F;
ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer inputLayer = inputs[1] as ElementGraphicsLayer;
if (inputLayer == null)  return;
。。。。。。

3、建议参考的其它示例:
(1)http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2007/10/24/Displaying-task-results-in-a-table.aspx
(2)http://arcscripts.esri.com/details.asp?dbid=15133
(3)http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2007/05/16/Print-Task-Sample.aspx

转载于:https://www.cnblogs.com/hualirpool/archive/2008/11/27/1342130.html

关于自定义任务(Tasks)的心得(转载)相关推荐

  1. nginx自定义模块编写-实时统计模块--转载

    原文:http://www.vimer.cn/2012/05/nginx%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9D%97%E7%BC%96%E5%86%99- ...

  2. 嵌入式心得 (转载)

    学习有捷径吗?俺认为是有的,正确的道路就是捷径.     就好象是爬山,如果有导游图,那就能找到一条最正确的路线:如果没有导游图,自己瞎琢磨,东问西问,也未必能找到最佳的路线.     有时候回首前尘 ...

  3. mybatisplus的CRUD基本使用心得--转载

    是对MyBatis-Plus的功能进行简单介绍,虽然是介绍,也让我们领略到他的优雅与强大.你是不是已经被吸引了?别着急,上一节,我们算是参观了MyBatis的风景,这一节,我将带你领略他独特的魅力. ...

  4. 谈谈建站心得(转载)[精华]

               从事互联网行业已经7年了,有一些感悟在脑中盘旋.经历了很多教训以及狂热,工作与生活给了我一些教训与心得,遇到一事情时,经常有一种似曾相识的感觉,但真要说出所以然,似无法将他们高度 ...

  5. 托福备考有用的心得 ——转载

    [转]这是一篇转载的文章,小斑我参考这篇文章的方法,阅读拿了30分哦!!现在推荐给大家! [背景介绍]             先报个分er~ 29  +  29  +  24  +  28  =   ...

  6. python语言中、外部模块先导入、再使用_python引入导入自定义模块和外部文件--转载Sumomo的博客...

    项目中想使用以前的代码,或者什么样的需求致使你需要导入外部的包 如果是web 下,比如说django ,那么你新建一个app,把你需要导入的说用东东,都写到这个app中,然后在setting中的app ...

  7. mysql之order by自定义排序规则进行排序(转载)

    1.问题描述 今天接到一个任务按照设备状态进行排序,课中>在线>离线,4是课中,0是在线,1是离线,所以排序规则是4,0,1没有规律,现在要进行排序. 2.上代码 SELECTdetail ...

  8. java 自定义错误代码_Java 自定义异常(转载)

    1.异常的分类 1. 非运行时异常(Checked Exception) Java中凡是继承自Exception但不是继承自RuntimeException的类都是非运行时异常. 2. 运行时异常(R ...

  9. 计算机科学与技术学习心得(转载)

    计算机科学与技术学习心得 计算机科学与技术反思录 计算机科学与技术这一门科学深深的吸引着我们这些同学们,上计算机系已经有近 三年了,自己也做了一些思考,我一直认为计算机科学与技术这门专业,在本科阶段是 ...

  10. win7 系统增加自定义分辨率_【文献转载】GT5000便携式多参数土壤呼吸测量系统用于棉花田间土壤二氧化碳释放量的测量...

    Mark D. McDonald等在耕作制度与施肥方式对棉花田间土壤CO2排放量影响的研究中,使用GT5000便携式多参数土壤呼吸测量系统测量田间土壤CO2的排放量. GT5000基于傅里叶变换红外光 ...

最新文章

  1. 小米4c怎么添加语言怎么设置在哪里,小米4c路由器设置教程
  2. 再见Python!Yann LeCun警告:深度学习需要新编程语言
  3. debian 9/ ubuntu 添加swap分区
  4. Qt paintevent事件
  5. 【MM模块】 Goods Issue 发货
  6. 模板方法模式(Tempalte Method Pattern)
  7. boost库linux编译安装
  8. python深入和扩展_加速方案 — Python扩展模块
  9. Django 数据库建表的时候 No migrations to apply原因出现和解决
  10. 一文讲解安卓应用软件开发有什么优势?
  11. 数据机房温湿度检测物联网以太网传感器解决方案
  12. 行为识别TSM训练ucf101数据集
  13. 5类6类7类网线对比_5类6类7类网线到底有什么区别?
  14. fudannlp的maven可编译版本
  15. 探花交友_第7章-完善消息功能以及个人主页
  16. office2016安装后新建图标(word\excel\ppt)等文件图标均显示白色
  17. JPA criteria 查询:类型安全与面向对象
  18. egret 实战教程之跳一跳(一)
  19. 搜索技巧:最全面的检索知识讲座
  20. CodeWarrior下载及安装

热门文章

  1. ZED2 ROS下bag包的录制与回放数据
  2. ORB_SLAM2+ZED 2
  3. golang range循环内部
  4. mongodb 集合操作 (增删改查)
  5. 解决API中无法使用session问题
  6. jqueryEasyui常用代码
  7. RUP---统一软件开发过程
  8. windows 8.1无人值守安装
  9. 从几何解释SVD分解
  10. linux那些鲜为人知的小秘密