1.页面传值:
一个页面中打开另一个页面、或跨页面操作另一页面的数据,在这个过程中,经常涉及到数据信息传递;
应用场景:登录成功显示主页、 列表页打开信息维护页、仓库、商品类别、商品信息跨页面选择等功能;
2.传值方式
项目举例背景
列表页面:FrmShelfList
信息页面:FrmShelfInfo
2.1使用构造函数进行传值
在信息页面定义构造函数
public FrmShelfInfo(int _actType)
{
InitializeComponent();
this.actType = _actType;
}
public FrmShelfInfo(int _actType, ShelfInfo shelf)
{
InitializeComponent();
this.actType = _actType;
editShelf = shelf;
}
在FrmShelfList使用构造函数传递值
FrmShelfInfo fShelf = null;
//把actType shelf 传到fShelf页面
//(1) 构造函数传值
if (actType == 1)
fShelf = new FrmShelfInfo(actType);
else if (actType == 2)
{
fShelf = new FrmShelfInfo(actType, shelf);
}
2.2 利用公有成员进行传值
将FrmShelfInfo 中要传递的值定义为公有成员
public int actType = 0;
public ShelfInfo editShelf = null;
在FrmShelfList可以直接对值进行赋值
fShelf = new FrmShelfInfo();
fShelf.actType = actType;
if (shelf != null)
fShelf.editShelf = shelf;
2.3 利用Tag属性进行传值
首先可以定义DataInfo类来进行存储数据
public class DataInfo
{
public int ActType { get; set; }
public ShelfInfo EditShelf { get; set; }
}
在FrmShelfList封装需要传递的信息
fShelf = new FrmShelfInfo();
fShelf.Tag = new DataInfo()
{
ActType = actType,
EditShelf = shelf
};
在FrmShelfInfo 中接收信息
if (Tag != null)
{
DataInfo data = this.Tag as DataInfo;
if (data != null)
{
actType = data.ActType;
editShelf = data.EditShelf;
}
}
2.4在父页面定义公有成员并设置子页面的所有者
将FrmShelfList设置为FrmShelfInfo 的拥有者
//(4) 所有者传值 当前页定义公开变量,当前面设置为目标页的所有者
fShelf = new FrmShelfInfo();
this.actType = actType;
this.shelf = shelf;
fShelf.Owner = this;//设置当前页为信息页的所有者
在FrmShelfInfo 页面接收信息
//所有者取值---不推荐使用
FrmShelfList frmList = this.Owner as FrmShelfList;//获取所有者
if (frmList != null)
{
actType = frmList.actType;
editShelf = frmList.shelf;
}
2.5使用静态变量进行值的传递
定义一个类,声明静态变量
public class StaticHelper
{
public static int actType = 0;
public static ShelfInfo editShelfInfo = null;
}
在FrmShelfList对静态变量进行赋值
//(5) 静态变量传值:先把存到静态变量中,在目标页中,从静态变量中取值
fShelf = new FrmShelfInfo();
StaticHelper.actType = actType;
StaticHelper.editShelfInfo = shelf;
在FrmShelfInfo 接收静态变量的值
//静态变量中取值
actType = StaticHelper.actType;
editShelf = StaticHelper.editShelfInfo;
3.五种方法的比较
比较五种值传递的方法的优缺点如下:
-
使用构造函数进行传值:
- 优点:
- 直观和明确:通过构造函数传递参数可以清晰地指定要传递的值,提高代码的可读性和可维护性。
- 数据封装:构造函数可以将传递的值封装在对象中,方便在目标页面中访问和使用。
- 缺点:
- 传递方式限制:只能在实例化对象时进行传递,无法在页面运行时动态改变传递的值。
- 对象创建复杂性:如果传递的数据较多,需要定义多个构造函数或使用多个参数,可能导致构造函数过于复杂。
- 优点:
-
利用公有成员进行传值:
- 优点:
- 简便和直接:通过公有成员,可以在页面间直接访问和传递数据,无需额外的传递方式或参数。
- 可动态修改:可以在页面运行时修改公有成员的值,实现动态传递和更新数据。
- 缺点:
- 全局可见性:公有成员对外可见,可能导致数据的访问权限和安全性问题。
- 数据耦合性:使用公有成员进行传值会增加页面间的耦合性,降低代码的灵活性和可重用性。
- 优点:
-
利用 Tag 属性进行传值:
- 优点:
- 内置属性:Tag 属性是控件的内置属性,无需额外定义或初始化,可以直接使用。
- 灵活性:Tag 属性可以存储任意类型的数据,适用于简单的数据传递需求。
- 缺点:
- 类型限制:由于 Tag 属性是对象类型,需要进行类型转换才能使用其中的具体数据。
- 语义模糊:Tag 属性本身没有明确的语义,可能导致数据的含义和用途不清晰。
- 优点:
-
在父页面定义公有成员并设置子页面的所有者:
- 优点:
- 父子关系:通过设置子页面的所有者,可以建立页面间的父子关系,方便数据传递和访问。
- 生命周期管理:父页面可以管理子页面的创建、销毁和传递数据的时机,实现数据的统一管理。
- 缺点:
- 页面耦合性:父页面和子页面之间存在强耦合关系,可能导致页面间的依赖性增加,不利于解耦和单独测试。
- 层次限制:该方法只适用于具有明确层次关系的页面结构,不适用于非父子关系的页面传值。
- 优点:
-
使用静态变量进行值的传递:
- 优点:
- 全局可访问:静态变量可以在整个应用程序域范围内访问,方便在不同页面之间传递数据。
- 生命周期长久:静态变量的生命周期与应用程序保持一致,数据可以长时间保持,方便在不同页面间共享和使用。
- 缺点:
- 全局可见性:静态变量对整个应用程序可见,可能导致数据的访问权限和安全性问题。
- 潜在的数据冲突:静态变量的全局可见性可能导致多个页面同时修改变量的值,需要进行线程同步和数据一致性的处理。
- 优点:
根据实际需求和具体情况,可以选择合适的方法进行值的传递。需要考虑数据的复杂性、安全性、耦合性、灵活性和代码可维护性等方面的因素。不同的场景可能适合使用不同的传值方式,综合权衡各种因素选择最合适的方法。