选择“操作”会初始化对应的“下一环节处理”,
选择“下一环节处理”会初始化“备选责任人”
//public delegate void EventHandler(object sender, EventArgs e); public event EventHandler PreSubmit; // 提交前事件触发 if (PreSubmit != null) { EventArgs ea = new EventArgs(); PreSubmit(this, ea); }
控件使用:
<!-- 注册用户组件 --> <%@ Register src="../../AspUC/Dispose/Dispose.ascx" tagname="Dispose" tagprefix="uc1" %> <div> <uc1:Dispose ID="Dispose1" runat="server" OnPreSubmit="SaveNetworkInfo"/> </div>
Dispose.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Dispose.ascx.cs" Inherits="OSP.Web.AspUC.Dispose.Dispose" %> <table style="table-layout:fixed;" id="opinionform"> <tr> <td class="leftform"> <table style=" table-layout:fixed;" > <tr> <td> <h2>处理意见</h2> </td> </tr> <tr> <td> <asp:TextBox ID="Comment" runat="server" TextMode="MultiLine" Rows="8"></asp:TextBox> </td> </tr> <tr> <td> <asp:LinkButton ID="LinkButton1" runat="server" onclick="LinkButton1_Click">保存常用意见</asp:LinkButton> <asp:DropDownList ID="UsualComment" runat="server" onselectedindexchanged="UsualComment_SelectedIndexChanged" AutoPostBack="true"> </asp:DropDownList> <asp:LinkButton ID="LinkButton2" runat="server" onclick="LinkButton2_Click">删除意见</asp:LinkButton> </td> </tr> </table> </td> <td class="rightform"> <table style="table-layout:fixed;" > <tr> <td > <h2>选择操作</h2> </td> </tr> <tr> <td> <asp:ListBox ID="Action" runat="server" Rows="4" onselectedindexchanged="Action_SelectedIndexChanged" AutoPostBack="true"></asp:ListBox> </td> </tr> <tr> <td > <h2>下一环节处理(多选时请按ctrl键)</h2> </td> </tr> <tr> <td> <asp:ListBox ID="Activity" runat="server" Rows="4" SelectionMode="Multiple" onselectedindexchanged="Activity_SelectedIndexChanged" AutoPostBack="true"></asp:ListBox> </td> </tr> </table> </td> </tr> <tr> <td colspan="2" class="bottomform"> <table style="width:100%;"> <tr> <td colspan="3" > <h2>选择执行人</h2> </td> </tr> <tr> <td> <h2>备选责任人</h2> </td> <td> </td> <td> <h2>已选责任人</h2> </td> </tr> <tr> <td> <asp:ListBox ID="OptUser1" runat="server" Rows="5"></asp:ListBox> </td> <td style="width:70px;"> <table style=" table-layout:fixed;"> <tr align="center"> <td> <asp:Button ID="Button1" runat="server" Text=">>" Width="50px" onclick="Button1_Click" /> </td> </tr> <tr align="center"> <td> <asp:Button ID="Button2" runat="server" Text=">" Width="50px" onclick="Button2_Click"/> </td> </tr> <tr align="center"> <td> <asp:Button ID="Button3" runat="server" Text="<" Width="50px" onclick="Button3_Click"/> </td> </tr> <tr align="center"> <td> <asp:Button ID="Button4" runat="server" Text="<<" Width="50px" onclick="Button4_Click"/> </td> </tr> </table> </td> <td> <asp:ListBox ID="OptUser2" runat="server" Rows="5"></asp:ListBox> </td> </tr> </table> </td> </tr> <tr> <td colspan="2" align="center"> <div class="button2"> <asp:ImageButton ID="ImageButton2" runat="server" ImageUrl="~/themes/default/images/btn_submit.gif" Width="50" Height="20" onclick="ImageButton2_Click"/> <asp:ImageButton ID="ImageButton3" runat="server" ImageUrl="~/themes/default/images/btn_close.gif" Width="50" Height="20" OnClientClick="window.returnValue=0;window.close();"/> </div> </td> </tr> </table>
Dispose.ascx.cs:
//属性 namespace OSP.Web.AspUC.Dispose { public partial class Dispose : System.Web.UI.UserControl { private BLL.WorkFlowBll workFlow = new BLL.WorkFlowBll(); #region 暴露属性 /// <summary> /// 提交前触发事件 外部设置 /// </summary> public event EventHandler PreSubmit; /// <summary> /// 提交后触发事件 外部设置 /// </summary> public event EventHandler PostSubmit; /// <summary> /// 环节参数:key=value;key=value... 外部设置 /// </summary> public string ActivityParam; /// <summary> /// 流程参数:key=value;key=value... 外部设置 /// </summary> public string ProcessParam; /// <summary> /// 下一环节名称 只读 /// </summary> public string NextActivityName { get { return Activity.SelectedItem.Text; } } /// <summary> /// 下一环节元数据 只读 /// </summary> public string NextActivityMetaData { get { return Activity.SelectedItem.Value; } } private decimal piid; public decimal ProcessInstanceId { get { return piid; } } #endregion
//页面加载 /// <summary> /// 页面加载 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 下一环节信息 string fullname = Page.Request.QueryString["fn"]; string sn = Page.Request.QueryString["sn"]; string originator = Page.Request.QueryString["ou"]; DataSet ds = null; if (string.IsNullOrEmpty(fullname)) { #region 流程过程审批 ds = workFlow.GetWorklistItem(sn, false); // 操作初始化 DataTable dta = ds.Tables["Action"]; Action.DataTextField = "Name"; Action.DataValueField = "Name"; Action.DataSource = dta; Action.DataBind(); #endregion } else { #region 流程发起选人 ds = XMLUtil.ConvertDataSet(workFlow.getNextActivityInfo(originator, fullname)); Action.Items.Add(new ListItem("开始","开始")); Action.SelectedIndex = 0; DataTable dta = ds.Tables["NextActivity"]; if (dta != null && dta.Rows.Count > 0) { Activity.Items.Add(new ListItem(dta.Rows[0]["ActName"].ToString(), dta.Rows[0]["MetaData"].ToString())); Activity.SelectedIndex = 0; DataTable dtu = ds.Tables["AvailableUser"]; if (dtu != null && dtu.Rows.Count > 0) { foreach(DataRow dr in dtu.Rows) { OptUser1.Items.Add(new ListItem(dtu.Rows[0]["UserName"].ToString(), dtu.Rows[0]["LoginID"].ToString())); } } } #endregion } this.ViewState["ds"] = ds; // 常用意见信息 DataSet dsoc = workFlow.getOftenComment(); UsualComment.Items.Add(new ListItem("-- 请选择 --", "0")); UsualComment.SelectedIndex = 0; if (dsoc.Tables["OftenComment"] != null) { foreach (DataRow dr in dsoc.Tables["OftenComment"].Rows) { UsualComment.Items.Add(new ListItem(dr["Comment"].ToString(), dr["CommentID"].ToString())); } } } }
//控件联动事件 #region 控件联动事件 /// <summary> /// 根据操作确定环节列表 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Action_SelectedIndexChanged(object sender, EventArgs e) { if (string.IsNullOrEmpty(Page.Request.QueryString["fn"])) { Activity.Items.Clear(); DataSet ds = (DataSet)this.ViewState["ds"]; if (Action.SelectedValue != null) { DataRow[] dr = null; if (ds.Tables["Action"] != null && (dr = ds.Tables["Action"].Select("Name='" + Action.SelectedValue + "'")).Length > 0) { dr = dr[0].GetChildRows(ds.Relations["Action_WFNextActivitys"]); if (dr.Length > 0) { DataRow[] d = dr[0].GetChildRows(ds.Relations["WFNextActivitys_NextActivity"]); foreach (DataRow dr2 in d) { Activity.Items.Add(new ListItem(dr2["ActName"].ToString(), dr2["MetaData"].ToString())); } OptUser1.DataSource = null; OptUser2.DataSource = null; OptUser1.DataBind(); OptUser2.DataBind(); } } } } } protected void Button1_Click(object sender, EventArgs e) { foreach (ListItem li in OptUser1.Items) { OptUser2.Items.Add(li); } OptUser1.Items.Clear(); } protected void Button2_Click(object sender, EventArgs e) { foreach (ListItem li in OptUser1.Items) { if (li.Selected) { OptUser2.Items.Add(li); } } foreach (ListItem li in OptUser2.Items) { OptUser1.Items.Remove(li); } OptUser1.SelectedIndex = -1; OptUser2.SelectedIndex = -1; } protected void Button3_Click(object sender, EventArgs e) { foreach (ListItem li in OptUser2.Items) { if (li.Selected) { OptUser1.Items.Add(li); } } foreach (ListItem li in OptUser1.Items) { OptUser2.Items.Remove(li); } OptUser1.SelectedIndex = -1; OptUser2.SelectedIndex = -1; } protected void Button4_Click(object sender, EventArgs e) { foreach (ListItem li in OptUser2.Items) { OptUser1.Items.Add(li); } OptUser2.Items.Clear(); } protected void Activity_SelectedIndexChanged(object sender, EventArgs e) { if (string.IsNullOrEmpty(Page.Request.QueryString["fn"])) { OptUser1.Items.Clear(); OptUser2.Items.Clear(); DataSet ds = (DataSet)this.ViewState["ds"]; if (Activity.SelectedValue != null) { string sql = "MetaData='" + Activity.Items[Activity.SelectedIndex].Value + "'"; for (int i = Activity.SelectedIndex + 1; i < Activity.Items.Count; i++) { if (Activity.Items[i].Selected) { sql += "or MetaData='" + Activity.Items[i].Value + "'"; } } DataRow[] dr = null; DataRow[] dr3 = null; if (ds.Tables["NextActivity"] != null && (dr = ds.Tables["NextActivity"].Select(sql)).Length > 0) { Dictionary<string, string> dir = new Dictionary<string, string>(); for (int j = 0; j < dr.Length; j++) { dr3 = dr[j].GetChildRows(ds.Relations["NextActivity_AvailableUsers"]); if (dr3.Length > 0) { DataRow[] d = dr3[0].GetChildRows(ds.Relations["AvailableUsers_AvailableUser"]); foreach (DataRow dr2 in d) { dir[dr2["LoginID"].ToString()] = dr2["UserName"].ToString(); } } } foreach (string key in dir.Keys) { OptUser1.Items.Add(new ListItem(dir[key], key)); } } } } } #endregion
// /// <summary> /// 提交审批 /// 提交前和后会触发相应事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ImageButton2_Click(object sender, ImageClickEventArgs e) { // 表单校验 if (OptUser1.Items.Count > 0 && OptUser2.Items.Count < 1) { ScriptManager.RegisterStartupScript(this, this.GetType(), "showMsg", "showMsg('请选择责任人!');", true); return; } if (Action.SelectedIndex < 0) { ScriptManager.RegisterStartupScript(this, this.GetType(), "showMsg", "showMsg('请选择操作!');", true); return; } if (Activity.SelectedIndex < 0) { ScriptManager.RegisterStartupScript(this, this.GetType(), "showMsg", "showMsg('请选择环节!');", true); return; } // 提交前事件触发 if (PreSubmit != null) { EventArgs ea = new EventArgs(); PreSubmit(this, ea); } #region 提交审批 // 下一环节信息 string fullname = Page.Request.QueryString["fn"]; string sn = Page.Request.QueryString["sn"]; string originator = Page.Request.QueryString["ou"]; string folio = Page.Request.QueryString["folio"]; string msg = ""; if (string.IsNullOrEmpty(fullname)) { string activityParam = "Outcome=k2sql:" + Action.SelectedValue; if (!string.IsNullOrEmpty(ActivityParam)) { activityParam += (";" + ActivityParam); } string processParam = ""; string userInfo = ""; if (OptUser2.Items.Count > 0) { userInfo = Activity.SelectedValue + "=k2sql:" + OptUser2.Items[0].Value; for (int i = 1; i < OptUser2.Items.Count; i ++) { userInfo += ",k2sql:" + OptUser2.Items[i].Value; } } processParam += userInfo; processParam += ";Route01=" + Activity.SelectedValue; if (!string.IsNullOrEmpty(ProcessParam)) { processParam += (";" + ProcessParam); } workFlow.finishWorkListItem(sn, Action.SelectedValue, activityParam, processParam, Comment.Text); msg = "审批成功!"; } else { string processParam = ""; string userInfo = ""; if (OptUser2.Items.Count > 0) { userInfo = Activity.SelectedValue + "=k2sql:" + OptUser2.Items[0].Value; for (int i = 1; i < OptUser2.Items.Count; i++) { userInfo += ",k2sql:" + OptUser2.Items[i].Value; } } processParam += userInfo; piid = Convert.ToDecimal(workFlow.startProcess(originator, fullname, folio, processParam)); msg = "流程发起成功!"; } #endregion // 提交后事件触发 if (PostSubmit != null) { EventArgs ea = new EventArgs(); PostSubmit(this, ea); } // 如果成功,关闭 ScriptManager.RegisterStartupScript(this, this.GetType(), "showMsg", "showMsg('" + msg + "');window.returnValue=1;window.close();", true); } protected void LinkButton2_Click(object sender, EventArgs e) { workFlow.deleOftenComment(UsualComment.SelectedValue); UsualComment.Items.Remove(UsualComment.Items[UsualComment.SelectedIndex]); UsualComment.SelectedIndex = 0; Comment.Text = ""; } protected void LinkButton1_Click(object sender, EventArgs e) { UsualComment.Items.Add(new ListItem(Comment.Text, workFlow.saveOftenComment(Comment.Text))); UsualComment.SelectedIndex = UsualComment.Items.Count - 1; } protected void UsualComment_SelectedIndexChanged(object sender, EventArgs e) { if (UsualComment.SelectedIndex != 0) { Comment.Text = UsualComment.SelectedItem.Text; } }
"常用意见数据源":
DataSet dsoc
//GetOftenComment.xml <?xml version="1.0" encoding="utf-8"?> <OftenComments> <Result>0</Result> <IsOK>true</IsOK> <OftenComment> <CommentID>22684FA6DD0B49B6B248E932666E4CB4</CommentID> <Comment>............hahahah3333同意</Comment> </OftenComment> <OftenComment> <CommentID>B1226234D35B4F7D9581C72D0DB03355</CommentID> <Comment>............hahahah</Comment> </OftenComment> <OftenComment> <CommentID>BE11D9B4767C44D196ABFC6DFF6C5CE2</CommentID> <Comment>............hahahah3333</Comment> </OftenComment> <Action>Get</Action> </OftenComments>
..
相关推荐
【标准模型组建】:在企业级应用开发中,标准模型组建是指遵循一定规范和标准的组件化开发模式。这种模式有利于提高代码的重用性,降低维护成本,同时使得不同开发者之间的工作能够更好地协同。 【WEB技术 B/S体系...
在启动阶段,项目经理通常会定义项目范围、创建项目章程并组建团队。在规划阶段,会制定详细的项目计划,包括时间表、预算和资源分配。执行阶段涉及实际的工作实施,而监控阶段则需跟踪进度、质量以及风险,确保项目...
- **.NET 架构**:微软提供的用于构建和运行应用程序的框架。 - **工作流技术**:用于自动化业务流程的技术。 - **1.8 软件工具** - **建模工具**:如 UML 建模工具。 - **软件开发工具**:如 IDE 集成开发环境...
docker imagedocker-compose
COMSOL 21700电池针刺热失控实验与结果分析,comsol 21700针刺热失控 ,comsol; 21700针; 刺热失控,COMSOL研究:21700电池针刺热失控现象解析
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1、文件内容:perl-File-ShareDir-1.03-8.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-File-ShareDir-1.03-8.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
"深入探究蠕动流与Brinkman达西定律在COMSOL模拟中的应用",蠕动流、Brinkman 达西定律COMSOL ,蠕动流; Brinkman 达西定律; COMSOL,**利用达西定律与Brinkman模型分析蠕动流现象**
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
JRT 0287-2023 人工智能算法金融应用信息披露指南.pdf
西门子S7协议纯指令编写源代码,支持多区域数据通信读写:Qx.y与Mx.y的单点操作,Byte、Word、DWORD的全面读写,以及V区浮点数处理,西门子S7协议通信,纯指令编写,不调用dll。 源代码 实现以下功能, 1,对单点读写,Qx.y,Mx.y的写入,Ix.y的读取。 2,对Byte,Word,DWORD的读写,支持读写Q区,I区,M区,V区。 3,对浮点数的读写,支持V区。 以上功能已经在S7 Smart PLC上测试过,带网口的CR40 CR60已支持。 ,西门子S7协议通信;纯指令编写;单点读写;Qx.y、Mx.y写入;Ix.y读取;Byte、Word、DWORD读写;Q区、I区、M区、V区读写;浮点数读写;S7 Smart PLC测试;网口CR40 CR60支持,西门子S7协议通信纯指令编写:PLC多区域读写及浮点数操作实现
matlab绘图 采用PreScan、ROS、Simulink进行自动驾驶控制算法仿真 横向控制采用的是stanley,MPC算法 使用说明 0分支说明 master分支:运行在ros端的控制算法,包括stanley,mpc。 PreScan分支:包含了prescan工程的压缩文件,解压后需要在matlab中添加自定义的ros msg,也就是src/nodes/msgs 配合控制程序,可以直接进行prescan-ros仿真。 1环境说明 PC1:装win10系统;运行prescan2019.2和matlab2019b;ip = 172.16.6.248 PC2:Ubuntu18.04,ros melodic;ip = 172.16.6.70 p.s. PC1和PC2应该处于同一网段下 2PC2(ubuntu18.04)操作说明 clone master分支的代码后 2.1修改PC2的.bashrc文件,向其中添加PC2的ip地址 sudo gedit ~/.bashrc #打开bashrc #在bashrc文件的末尾添加如下两行 export ROS_IP=172.16.
B2B2C2021H5 + 100% PHP8.2 + Laravel10.0
内容概要:本文详细介绍了C++从基础语法、面向对象编程到高级特性等方面的编程要点,包括变量与数据类型、运算符与表达式、控制结构、类与对象、封装、继承、多态等核心概念,并深入探讨了C++在游戏开发、人工智能、操作系统开发等热门领域的具体应用案例。此外,还讲解了C++在模板、异常处理和智能指针方面的高级功能。最后总结了C++在现代科技发展中扮演的重要角色和未来的应用前景。 适合人群:具备一定编程背景的开发者,特别是对C++语言感兴趣的初级至中级程序员。 使用场景及目标:①希望通过本文深入了解C++的各个方面,并在实践中更好地应用;②提升C++编程技能,在涉及高性能计算、嵌入式系统、人工智能等领域时能够得心应手;③掌握最新的C++技术和趋势,为应对未来技术变革做好准备。 其他说明:本文不仅讲述了C++的基本理论知识,还在多个实际案例中展示了如何运用这些知识解决问题,帮助读者更好地理解C++的特点与优势。
Matlab
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
"深入解析S7-200组态王液位串级控制:双容带前馈与反馈的梯形图接线图原理及IO分配与组态画面详解",No.92 S7-200组态王液位串级控制,双容带前馈和反馈 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,S7-200组态王液位;串级控制;双容带前馈和反馈;梯形图接线图原理图;IO分配;组态画面,"S7-200液位串级控制:双容前馈反馈组态原理图及IO分配详解"