Previous topicNext topic
Help > 开发指南 > 预备知识 >
如何传递共享变量

这里不我们不会介绍一个过程中使用的私有变量该如何定义,我们主要介绍如何在不同的方法、事件、窗体之间传递、共享变量信息。

1、在全局代码中,设置一个静态类,在其中定义静态属性、静态字段。全局代码我暂时没有写示例是因为我觉得没有必要。虽然有这么个选择,但是使用它的场景应该是万分之一。因为每定义一个变量,得重启一下软件,这个特性还是挺蛋疼的。

2、Proj.ExtendedProperties:这个静态属性本质上是一个Dictionary<string, object>字典,所以我们可以根据字典的使用习惯来使用这个共享数据的属性。注意:这里的Key值不区分大小写。

 VB.Net
'添加
'第一种:添加键值对
Proj.ExtendedProperties.Add("a","aa")
'第二种:直接赋值,字典的使用方式就是可以直接向指定的Key中赋值,如果已经存在此Key则替换,如果不存在此Key则添加
Proj.ExtendedProperties("a")="aa"

'取值
If Proj.ExtendedProperties.ContainsKey("A") Then '在取值之前可以先判断一下需要查询的Key是否存在。我们这里忽略Key值的大小写
    '包含此Key则取值
    Dim strReturn As String=Proj.ExtendedProperties("a")
End If

'删除
Proj.ExtendedProperties.Remove("a")

C#
// 添加
// 第一种:添加键值对
Proj.ExtendedProperties.Add("a", "aa");
// 第二种:直接赋值,字典的使用方式就是可以直接向指定的Key中赋值,如果已经存在此Key则替换,如果不存在此Key则添加
Proj.ExtendedProperties["a"] = "aa";

// 取值
if (Proj.ExtendedProperties.ContainsKey("A")) //判断不区分大小写
{
    // 包含此Key则取值
    string strReturn = Proj.ExtendedProperties["a"].CType<string>("");
}

// 删除
Proj.ExtendedProperties.Remove("a");

3、Proj.Vars:这个静态属性是一个VarCollection对象,本质就是一个单行数据的DataTable,我们添加一个变量其实就是动态添加一个字段。它的用法其实跟上面的字典类似。唯一的好处是,Var变量有一个ColDataChanged事件,我们可以检测变量的值变化。

 Vb.Net
'直接赋值,赋值的内容必须是确定的数据类型
Proj.Vars("a")="aa"

'取值
If Proj.Vars.Contains("A") Then '在取值之前可以先判断一下需要查询的Key是否存在。我们这里忽略Key值的大小写
    '包含此Key则取值
    Dim strReturn As String=Proj.Vars("a")
End If

'删除
Proj.Vars.Remove("a")

 C#
// 直接赋值,赋值的内容必须是确定的数据类型
Proj.Vars["a"] = "aa";

// 取值
if (Proj.Vars.Contains("A"))
{
    // 包含此Key则取值
    string strReturn = Proj.Vars["a"].CType<string>("");
}

// 删除
Proj.Vars.Remove("a");

4、Proj.FormTags:这个静态属性是一个UserTags对象,本质也还是一个多行数据的DataTable,我们可以建立三个维度的备注信息,方便立体地管理一些临时变量与备注信息。示例:FormTags["窗体名称","控件名称"]=值

 Vb.Net
'二维参数直接赋值
Proj.FormTags("窗体A","文本控件A")="aa"
Proj.FormTags("窗体A","文本控件B")="bb"
'三个参数直接赋值
'Proj.FormTags.ExtendedProperties相当于一个字典
Proj.FormTags.ExtendedProperties("窗体A","文本控件A")("属性A")="cc"
Proj.FormTags.ExtendedProperties("窗体A","文本控件A")("属性B")="dd"

'二维参数取值
If Proj.FormTags.Contains("窗体A","文本控件A") Then '在取值之前可以先判断一下需要查询的Key是否存在。
    '包含此Key则取值
    Dim strReturn As String=Proj.FormTags("窗体A","文本控件A")
End If

'三维参数取值
If Proj.FormTags.ExtendedProperties("窗体A","文本控件A").ContainsKey("属性A") Then '在取值之前可以先判断一下需要查询的Key是否存在。
    '包含此Key则取值
    Dim strReturn As String=Proj.FormTags.ExtendedProperties("窗体A","文本控件A")("属性A")
End If

'删除
Proj.FormTags.Remove("窗体A","文本控件A")
'批量删除
Proj.FormTags.RemoveRange("窗体A") '此命令会删除所有第一个参数为“窗体A”的键值

 C#
// 对索引二维参数直接赋值
Proj.FormTags["窗体A", "文本控件A"] = "aa";
Proj.FormTags["窗体A", "文本控件B"] = "bb";
// 三个参数直接赋值
// Proj.FormTags.ExtendedProperties方法相当于一个字典
Proj.FormTags.ExtendedProperties("窗体A", "文本控件A")["属性A"] = "cc";
Proj.FormTags.ExtendedProperties("窗体A", "文本控件A")["属性B"] = "dd";

// 二维参数取值
if (Proj.FormTags.Contains("窗体A", "文本控件A"))
{
    // 包含此Key则取值
    string strReturn = Proj.FormTags["窗体A", "文本控件A"].CType<string>("");
    MessageBox.Show(strReturn);
}


// 三维参数取值
if (Proj.FormTags.ExtendedProperties("窗体A", "文本控件A").ContainsKey("属性A"))
{
    // 包含此Key则取值
    string strReturn = Proj.FormTags.ExtendedProperties("窗体A", "文本控件A")["属性A"].CType<string>("");
    MessageBox.Show(strReturn);
}


// 删除
Proj.FormTags.Remove("窗体A", "文本控件A");
// 批量删除
Proj.FormTags.RemoveRange("窗体A"); // 此命令会删除所有第一个参数为“窗体A”的键值

5、控件中的Tag属性。我们都知道Control类中有一个Tag属性,它是Object类型的,编程的时候大多数的人都是通过这个属性来实现部分传递数据的功能。但是缺点是,它就只有这么一个属性,用起来可能不够用。我们平台利用了这个Tag属性,将它扩展了多个方便我们使用的方法,它们分别为TagNew()、UserData()、ExtendedProperties()。注意:请您看到TagNew()这个扩展方法后,一定一定不要再使用Tag属性了!

使用方法见下面的示例:

Vb.Net
Dim txtName As SmTextBox=Proj.OpenedForms("窗体A").ControlDictionary()("文本控件A")
'直接赋值
txtName.ExtendedProperties()("aa")="aa"
'判断是否有Key,有的话则读取Value
If txtName.ExtendedProperties().ContainsKey("aa") Then
    '包含此Key则取值
    Dim strReturn As String=txtName.ExtendedProperties()("aa")
End If
'删除指定的键值对
txtName.ExtendedProperties().Remove("aa")

'UserData只有简单的写入与读取
'UserData赋值
txtName.UserData("bb",PropertyTypeEnum.Set)
'UserData读取值
Dim strR As String=txtName.UserData()

'TagNew跟UserData用法一样,只是为了照顾一些习惯了使用Tag属性的朋友,
'当你们看到TagNew这个扩展方法的时候,请不要再使用Tag属性了,使用了
'只会出现异常
'TagNew赋值
txtName.TagNew("bb",PropertyTypeEnum.Set)
'TagNew读取值
Dim strR2 As String=txtName.TagNew()

C#
SmTextBox txtName = Proj.OpenedForms["窗体A"].ControlDictionary()["文本控件A"] as SmTextBox;
// 直接赋值
txtName.ExtendedProperties()["aa"] = "aa";
// 判断是否有Key,有的话则读取Value
if (txtName.ExtendedProperties().ContainsKey("aa"))
{
    // 包含此Key则取值
    string strReturn = txtName.ExtendedProperties()["aa"].CType<string>("");
}
// 删除指定的键值对
txtName.ExtendedProperties().Remove("aa");

// UserData只有简单的写入与读取
// UserData赋值
txtName.UserData("bb", PropertyTypeEnum.Set);
// UserData读取值
string strR = txtName.UserData();

// TagNew跟UserData用法一样,只是为了照顾一些习惯了使用Tag属性的朋友,
// 当你们看到TagNew这个扩展方法的时候,请不要再使用Tag属性了,使用了
// 只会出现异常
// TagNew赋值
txtName.TagNew("bb", PropertyTypeEnum.Set);
// TagNew读取值
string strR2 = txtName.TagNew();

6、窗体中的数据共享 。 在SmForm中有ExtendedProperties属性,它和Proj.ExtendedProperties的用法一样,本质上就是一个 Dictionary<string, object>字典。另外SmForm还有一个FormReturnValue对象,这个对象可以传递很多数据,方便我们在不同窗体之间进行数据交换使用。

Vb.Net
Dim frm As SmForm =Proj.OpenedForms("窗体A")
'直接赋值
frm.ExtendedProperties("aa")="bb"
'判断是否有Key,有的话则读取Value
If frm.ExtendedProperties.ContainsKey("aa") Then
    '包含此Key则取值
    Dim strReturn As String=frm.ExtendedProperties("aa")
End If
'删除指定的键值对
frm.ExtendedProperties.Remove("aa")

'先定义一个FormReturnValue对象
Dim returnValue As New FormReturnValue
'输入一个参数到此对象中,方便窗体加载时引用
returnValue.ReturnValue="要传入的参数"
'如果有多个参数,也可以传入
returnValue.ExtendedProperties("其他参数")="其他参数值"
'将FormReturnValue对象赋值给SmForm.FormReturnValue属性,这样窗体加载时就可以访问到传入的参数
frm.FormReturnValue=returnValue
'如果窗体返回OK状态
If frm.ShowDialog()=DialogResult.OK Then
    '窗体处理完数据后,将信息再存到FormReturnValue对象中,我们此时再取出来
    Dim strMsgReturn As String=returnValue.ReturnValue
    MessageBox.Show(strMsgReturn)
End If

C#
SmForm frm = Proj.OpenedForms["窗体A"];
// 直接赋值
frm.ExtendedProperties("aa") = "bb";
// 判断是否有Key,有的话则读取Value
if (frm.ExtendedProperties.ContainsKey("aa"))
{
    // 包含此Key则取值
    string strReturn = frm.ExtendedProperties["aa"].CType<string>("");
}

// 删除指定的键值对
frm.ExtendedProperties.Remove("aa");

// 先定义一个FormReturnValue对象
FormReturnValue returnValue = new FormReturnValue();
// 输入一个参数到此对象中,方便窗体加载时引用
returnValue.ReturnValue = "要传入的参数";
// 如果有多个参数,也可以传入
returnValue.ExtendedProperties["其他参数"] = "其他参数值";
// 将FormReturnValue对象赋值给SmForm.FormReturnValue属性,这样窗体加载时就可以访问到传入的参数
frm.FormReturnValue = returnValue;
// 如果窗体返回OK状态
if (frm.ShowDialog() == DialogResult.OK)
{
    // 窗体处理完数据后,将信息再存到FormReturnValue对象中,我们此时再取出来
    string strMsgReturn = returnValue.ReturnValue;
    MessageBox.Show(strMsgReturn);
}

7、在类中定义私有字段共享数据 。 我们在窗体表事件、窗体控件事件中,由于所有事件都是在一个类当中,所以我们就可以直接定义私有字段,来实现在不同事件或方法之间共享数据。