Workflow表单的作用是能够在客户端进行表单设计,然后在流程中动态开放哪些输入框可以供用户填写。
在这里我扩展了一个常用的WebEditor工具——KindEditor,能够插入自定义的html符号,如下图:
Form类如下:
1 public delegate string SetAutoCompleteValue(string autoCompleteType); 2 3 [Serializable] 4 public class Form 5 { 6 [XmlAttribute] 7 public Guid FormId { get; set; } 8 [XmlAttribute] 9 public string FormName { get; set; } 10 [XmlAttribute] 11 public string FormCategory { get; set; } 12 [XmlAttribute] 13 public string FormContent { get; set; } 14 [XmlAttribute] 15 public DateTime CreateDate { get; set; } 16 public Person Creator { get; set; } 17 18 19 public string CreaterName 20 { 21 get { return Creator != null ? Creator.PersonName : ""; } 22 } 23 24 public List<FormControl> FormControls { get; set; } 25 26 public void InitializeFormControls() 27 { 28 if (!string.IsNullOrEmpty(FormContent)) 29 { 30 const string pattern = @"\<input(.*?)\/>"; 31 var rx = new Regex(pattern); 32 var matches = rx.Matches(FormContent); 33 var formControls = new List<FormControl>(); 34 foreach (Match match in matches) 35 { 36 string fieldLabel = Convert.ToString(match.Groups[0]); //Group[0] :[xx],Group[1]: xx 37 string[] para = fieldLabel.Split(' '); 38 39 var values = para.First(s => s.Trim().ToLower() 40 .StartsWith("value=")).Replace("value=", "").Replace("\"", ""); 41 42 string[] sArray = Regex.Split(values, "//", RegexOptions.IgnoreCase); 43 44 bool isNewControl = true; 45 string controlId = string.Empty; 46 if (para.Any(p => p.StartsWith("id="))) 47 { 48 isNewControl = false; 49 controlId = para.First(s => s.Trim().ToLower() 50 .StartsWith("id=")).Replace("id=", "").Replace("\"", ""); 51 } 52 53 if (sArray.Count() >= 3) //每个输入框表单至少要有三个以上属性 54 { 55 FormControl formControl ; 56 if (isNewControl) 57 { 58 switch (sArray[0]) 59 { 60 case "单行": 61 formControl = new TextLineFormControl(); 62 formControl.Width = int.Parse(sArray[2]); 63 break; 64 case "多行": 65 formControl = new MultiLineFormControl(); 66 formControl.Width = int.Parse(sArray[2]); 67 formControl.Height = int.Parse(sArray[3]); 68 break; 69 case "单选": 70 formControl = new RadioFormControl(); 71 formControl.InitialData = sArray[2]; 72 break; 73 case "多选": 74 formControl = new CheckBoxFormControl(); 75 formControl.InitialData = sArray[2]; 76 break; 77 case "下拉": 78 formControl = new DropDownFormControl(); 79 formControl.InitialData = sArray[2]; 80 break; 81 case "自动": 82 formControl = new AutoCompleteFormControl(); 83 formControl.InitialData = sArray[2]; 84 break; 85 default: 86 formControl = new UnknowFormControl(); 87 break; 88 } 89 formControl.FieldName = sArray[1]; 90 formControl.ControlId = Guid.NewGuid(); 91 92 } 93 else 94 { 95 formControl = FormControls.Single(f => f.ControlId == Guid.Parse(controlId)); 96 switch (sArray[0]) 97 { 98 case "单行": 99 formControl.Width = int.Parse(sArray[2]); 100 break; 101 case "多行": 102 formControl.Width = int.Parse(sArray[2]); 103 formControl.Height = int.Parse(sArray[3]); 104 break; 105 case "单选": 106 formControl.InitialData = sArray[2]; 107 break; 108 case "多选": 109 formControl.InitialData = sArray[2]; 110 break; 111 case "下拉": 112 formControl.InitialData = sArray[2]; 113 break; 114 case "自动": 115 formControl.InitialData = sArray[2]; 116 break; 117 default: 118 break; 119 } 120 } 121 122 formControls.Add(formControl); 123 FormContent = FormContent.Replace(match.Value, 124 string.Format("{{{0}}}", formControl.ControlId)); 125 } 126 127 } 128 FormControls = formControls; 129 FormContent = FormContent; 130 } 131 } 132 133 public string GetOccupyContentString() 134 { 135 var str = FormContent; 136 foreach (var formControl in FormControls) 137 { 138 str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), formControl.GetDesignString()); 139 } 140 return str; 141 } 142 143 public string GetPreviewContentString() 144 { 145 var str = FormContent; 146 147 foreach (var formControl in FormControls) 148 { 149 str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), formControl.GetInputString()); 150 } 151 return str; 152 } 153 154 public string GetPreviewContentString(Dictionary<Guid, string> writedValues) 155 { 156 var str = FormContent; 157 158 foreach (var formControl in FormControls) 159 { 160 string value = null; 161 if (writedValues != null && writedValues.TryGetValue(formControl.ControlId, out value)) 162 { 163 str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), value); 164 } 165 else 166 { 167 str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), string.Empty); 168 } 169 } 170 return str; 171 } 172 173 public string GetDisplayContent(List<Guid> canWriteformControlIds, SetAutoCompleteValue autoCompleteValue, Dictionary<Guid, string> writedValues = null) 174 { 175 var str = FormContent; 176 177 foreach (var formControl in FormControls) 178 { 179 if (canWriteformControlIds.Contains(formControl.ControlId)) 180 { 181 string value = null; 182 if (writedValues != null && writedValues.TryGetValue(formControl.ControlId, out value)) 183 { 184 formControl.FieldValue = value; 185 } 186 if (string.IsNullOrEmpty(value) && formControl is AutoCompleteFormControl && 187 !string.IsNullOrEmpty(formControl.InitialData) && autoCompleteValue != null) 188 { 189 formControl.FieldValue = autoCompleteValue(formControl.InitialData); 190 } 191 str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), formControl.GetInputString()); 192 } 193 else 194 { 195 string value = string.Empty; 196 if (writedValues != null && writedValues.TryGetValue(formControl.ControlId, out value)) 197 { 198 formControl.FieldValue = value; 199 } 200 str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), value); 201 } 202 } 203 return str; 204 } 205 }