创建一个Instantiation表单,其实和创建一个Association表单是十分相识的,我也不像在这里把代码一一的贴出来,最后我会把所有的工程一次性的贴出来的.
在前面创建Association Form的时候,为了简化过程,我没有讲如何将Association Data传到workflow中,并在Instantiation Form中使用.
首先,为了简化,Association表单和Instantiation表单是一样的,两个表单都是一个PeoplePicker和一个TextBox,所以用于表示两个表单数据的类是相同的,只不过为了让代码看起来更清楚点,我定义了两个类,完全一样,只不过名字是不同的.
1 [Serializable]
2 public class AssociationData
3 {
4 private Contacts reviewers = default(Contacts);
5 public Contacts Reviewers
6 {
7 get
8 {
9 return this.reviewers;
10 }
11 set
12 {
13 this.reviewers = value;
14 }
15 }
16
17 private string description = default(string);
18 public string Description
19 {
20 get
21 {
22 return this.description;
23 }
24 set
25 {
26 this.description = value;
27 }
28 }
29
30 public void AddContact(string contact)
31 {
32 if (this.reviewers == null)
33 {
34 this.reviewers = new Contacts();
35 }
36 this.reviewers.AddContact(contact);
37 }
38 public string[] GetReviewers()
39 {
40 return this.reviewers.ContactList.ToArray();
41 }
42 }
43
44 [Serializable()]
45 public class Contacts
46 {
47 private List<string> contacts;
48
49 public List<string> ContactList
50 {
51 get { return contacts; }
52 set { contacts = value; }
53 }
54 public void AddContact(string contact)
55 {
56 if (this.contacts == null)
57 {
58 this.contacts = new List<string>();
59 }
60 this.contacts.Add(contact);
61 }
62
63 }
因为PeoplePick是可以选择多个用户的,所以创建了一个Contact类,用来保存用户名.记得定义这些类需要加上[Serializable()],因为这些类会被序列化并传递给workflow实例.为此,我们也需要写两个辅助的函数,用于将我们输入的数据序列化成字符串,或是将序列化的数据反序列化成相应的对象.下面代码中的DeserializeAssoicationData函数,是将从Association表单中传递下来的序列化后的数据重新反序列化成相应的实例对象,而这些实例对象中的数据可以在Instantiation表单中被使用.serializeInstantiationFormDataToXML函数是将Instantiation表单中的数据序列化为XML字符串,传递给workflow实例,使得这些数据能够被后续的步骤中使用.
public string serializeInstantiationFormDataToXML()
{
InstantiationData mydata = new InstantiationData();
string serializedDataToReturn;
foreach (PickerEntity pe in Reviewers.ResolvedEntities)
{
mydata.AddContact(pe.Key);
}
mydata.Description = Description.Text;
.
using (MemoryStream stream = new MemoryStream())
{
XmlSerializer serializer = new XmlSerializer(typeof(InstantiationData));
serializer.Serialize(stream, mydata);
stream.Position = 0;
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
serializedDataToReturn = Encoding.UTF8.GetString(bytes);
}
return serializedDataToReturn;
}
private AssociationData DeserializeAssoicationData(string dataPassedIn)
{
XmlSerializer serializer = new XmlSerializer(typeof(AssociationData));
XmlTextReader reader = new XmlTextReader(new System.IO.StringReader(dataPassedIn));
AssociationData deserializedAssociationFormData = (AssociationData)serializer.Deserialize(reader);
return deserializedAssociationFormData;
}
至于Instantiation表单的ASPX页面,对于我来说,是很Assocaition页面是完全一样的,除了最开始的Inherit属性不同之外,其它的完全一样.而其相应的后台代码,和Association的后台代码是十分相似的,大家到时候看看代码就明白了.