.net之工作流工程展示及代码分享(一)工作流表单

时间:2023-03-08 21:36:42
.net之工作流工程展示及代码分享(一)工作流表单

Workflow表单的作用是能够在客户端进行表单设计,然后在流程中动态开放哪些输入框可以供用户填写。

在这里我扩展了一个常用的WebEditor工具——KindEditor,能够插入自定义的html符号,如下图:

.net之工作流工程展示及代码分享(一)工作流表单

Form类如下:

     public delegate string SetAutoCompleteValue(string autoCompleteType);

     [Serializable]
public class Form
{
[XmlAttribute]
public Guid FormId { get; set; }
[XmlAttribute]
public string FormName { get; set; }
[XmlAttribute]
public string FormCategory { get; set; }
[XmlAttribute]
public string FormContent { get; set; }
[XmlAttribute]
public DateTime CreateDate { get; set; }
public Person Creator { get; set; } public string CreaterName
{
get { return Creator != null ? Creator.PersonName : ""; }
} public List<FormControl> FormControls { get; set; } public void InitializeFormControls()
{
if (!string.IsNullOrEmpty(FormContent))
{
const string pattern = @"\<input(.*?)\/>";
var rx = new Regex(pattern);
var matches = rx.Matches(FormContent);
var formControls = new List<FormControl>();
foreach (Match match in matches)
{
string fieldLabel = Convert.ToString(match.Groups[]); //Group[0] :[xx],Group[1]: xx
string[] para = fieldLabel.Split(' '); var values = para.First(s => s.Trim().ToLower()
.StartsWith("value=")).Replace("value=", "").Replace("\"", ""); string[] sArray = Regex.Split(values, "//", RegexOptions.IgnoreCase); bool isNewControl = true;
string controlId = string.Empty;
if (para.Any(p => p.StartsWith("id=")))
{
isNewControl = false;
controlId = para.First(s => s.Trim().ToLower()
.StartsWith("id=")).Replace("id=", "").Replace("\"", "");
} if (sArray.Count() >= ) //每个输入框表单至少要有三个以上属性
{
FormControl formControl ;
if (isNewControl)
{
switch (sArray[])
{
case "单行":
formControl = new TextLineFormControl();
formControl.Width = int.Parse(sArray[]);
break;
case "多行":
formControl = new MultiLineFormControl();
formControl.Width = int.Parse(sArray[]);
formControl.Height = int.Parse(sArray[]);
break;
case "单选":
formControl = new RadioFormControl();
formControl.InitialData = sArray[];
break;
case "多选":
formControl = new CheckBoxFormControl();
formControl.InitialData = sArray[];
break;
case "下拉":
formControl = new DropDownFormControl();
formControl.InitialData = sArray[];
break;
case "自动":
formControl = new AutoCompleteFormControl();
formControl.InitialData = sArray[];
break;
default:
formControl = new UnknowFormControl();
break;
}
formControl.FieldName = sArray[];
formControl.ControlId = Guid.NewGuid(); }
else
{
formControl = FormControls.Single(f => f.ControlId == Guid.Parse(controlId));
switch (sArray[])
{
case "单行":
formControl.Width = int.Parse(sArray[]);
break;
case "多行":
formControl.Width = int.Parse(sArray[]);
formControl.Height = int.Parse(sArray[]);
break;
case "单选":
formControl.InitialData = sArray[];
break;
case "多选":
formControl.InitialData = sArray[];
break;
case "下拉":
formControl.InitialData = sArray[];
break;
case "自动":
formControl.InitialData = sArray[];
break;
default:
break;
}
} formControls.Add(formControl);
FormContent = FormContent.Replace(match.Value,
string.Format("{{{0}}}", formControl.ControlId));
} }
FormControls = formControls;
FormContent = FormContent;
}
} public string GetOccupyContentString()
{
var str = FormContent;
foreach (var formControl in FormControls)
{
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), formControl.GetDesignString());
}
return str;
} public string GetPreviewContentString()
{
var str = FormContent; foreach (var formControl in FormControls)
{
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), formControl.GetInputString());
}
return str;
} public string GetPreviewContentString(Dictionary<Guid, string> writedValues)
{
var str = FormContent; foreach (var formControl in FormControls)
{
string value = null;
if (writedValues != null && writedValues.TryGetValue(formControl.ControlId, out value))
{
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), value);
}
else
{
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), string.Empty);
}
}
return str;
} public string GetDisplayContent(List<Guid> canWriteformControlIds, SetAutoCompleteValue autoCompleteValue, Dictionary<Guid, string> writedValues = null)
{
var str = FormContent; foreach (var formControl in FormControls)
{
if (canWriteformControlIds.Contains(formControl.ControlId))
{
string value = null;
if (writedValues != null && writedValues.TryGetValue(formControl.ControlId, out value))
{
formControl.FieldValue = value;
}
if (string.IsNullOrEmpty(value) && formControl is AutoCompleteFormControl &&
!string.IsNullOrEmpty(formControl.InitialData) && autoCompleteValue != null)
{
formControl.FieldValue = autoCompleteValue(formControl.InitialData);
}
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), formControl.GetInputString());
}
else
{
string value = string.Empty;
if (writedValues != null && writedValues.TryGetValue(formControl.ControlId, out value))
{
formControl.FieldValue = value;
}
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), value);
}
}
return str;
}
}

[Serializable]标识是为了能序列化类;

[XmlAttribute]是为了在持久化保存到数据库的时候使用XML特性,节约保存控件,便于查询操作。

InitializeFormControls:从编辑器中读入的代码进行初始化;

其它的方法基本用于前台呈现。

FormControl类如下:

基类:

     [Serializable]
[XmlInclude(typeof(TextLineFormControl))]
[XmlInclude(typeof(MultiLineFormControl))]
[XmlInclude(typeof(RadioFormControl))]
[XmlInclude(typeof(CheckBoxFormControl))]
[XmlInclude(typeof(DropDownFormControl))]
[XmlInclude(typeof(AutoCompleteFormControl))]
[XmlInclude(typeof(UnknowFormControl))]
public abstract class FormControl
{
[XmlAttribute]
public Guid ControlId { get; set; }
[XmlAttribute]
public string FieldName { get; set; }
[XmlAttribute]
public string FieldValue { get; set; }
[XmlAttribute]
public int Width { get; set; }
[XmlAttribute]
public int Height { get; set; }
[XmlAttribute]
public string ToolTip { get; set; }
[XmlAttribute]
public bool Required { get; set; }
[XmlAttribute]
public bool CanWrite { get; set; }
[XmlAttribute]
public string InitialData { get; set; }
public abstract string GetDesignString();
public abstract string GetInputString();
}

[XmlInclude(typeof(TextLineFormControl))]..... 为了持久化时能够将派生类兼容存储;

GetDesignString:在设计器里呈现的方式;

GetInputString:在让用户输入时呈现的代码。

几个派生类:

     [Serializable]
public class TextLineFormControl : FormControl
{
public override string GetDesignString()
{
return string.Format("<input type=\"text\" value=\"{0}//{1}//{2}\" style=\"{3}\" id=\"{4}\">",
WorkflowConstant.TextBoxFormControlName, FieldName, Width, WorkflowConstant.ControlDesignWidth,ControlId);
} public override string GetInputString()
{
return string.Format("<input type=\"text\" value=\"{0}\" id=\"{1}\" size=\"{2}\" maxlength=\"{2}\" name=\"{1}\" >",
FieldValue, ControlId, Width);
}
} [Serializable]
public class MultiLineFormControl : FormControl
{
public override string GetDesignString()
{
return string.Format("<input type=\"text\" value=\"{0}//{1}//{2}//{5}\" style=\"{3}\" id=\"{4}\">",
WorkflowConstant.TextAreaFormControlName, FieldName, Width, WorkflowConstant.ControlDesignWidth, ControlId, Height);
} public override string GetInputString()
{
return string.Format("<textarea cols=\"{2}\" rows=\"{3}\" id=\"{1}\" name=\"{1}\" >{0}</textarea>",
FieldValue != null ? FieldValue.Replace("<br/>", "\n\r") : string.Empty, ControlId, Width, Height);
}
} [Serializable]
public class RadioFormControl : FormControl
{
public override string GetDesignString()
{
return string.Format("<input type=\"text\" value=\"{0}//{1}//{2}\" style=\"{3}\" id=\"{4}\">",
WorkflowConstant.RadioFormControlName, FieldName, InitialData, WorkflowConstant.ControlDesignWidth, ControlId);
} public override string GetInputString()
{
StringBuilder sb= new StringBuilder();
var data = InitialData.Split('|');
for (int i = ; i < data.Length; i ++)
{
sb.AppendFormat("<input type=\"radio\" name=\"{0}\" id=\"{0}-{1}\" value=\"{2}\" {3}/>", ControlId, i,
data[i], FieldValue == data[i] ? " checked=\"checked\"" : string.Empty);
sb.AppendFormat("<label for=\"{0}-{1}\">{2}</label>", ControlId, i, data[i]);
}
return sb.ToString();
}
}
.........

Form类使用InitializeFormControls方法生成各种实例化控件,放在FormControls字段里。

这两个类使用的基本上是领域模型。

本系列导航:

  1. .net之工作流工程展示及代码分享(预告)
  2. .net之工作流工程展示及代码分享(一)工作流表单
  3. .net之工作流工程展示及代码分享(二)工作流引擎
  4. .net之工作流工程展示及代码分享(三)数据存储引擎
  5. .net之工作流工程展示及代码分享(四)主控制类
  6. .net之工作流工程展示及代码分享(五)前端交互