Form页面传值

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.五种方法的比较

比较五种值传递的方法的优缺点如下:

  1. 使用构造函数进行传值:

    • 优点:
      • 直观和明确:通过构造函数传递参数可以清晰地指定要传递的值,提高代码的可读性和可维护性。
      • 数据封装:构造函数可以将传递的值封装在对象中,方便在目标页面中访问和使用。
    • 缺点:
      • 传递方式限制:只能在实例化对象时进行传递,无法在页面运行时动态改变传递的值。
      • 对象创建复杂性:如果传递的数据较多,需要定义多个构造函数或使用多个参数,可能导致构造函数过于复杂。
  2. 利用公有成员进行传值:

    • 优点:
      • 简便和直接:通过公有成员,可以在页面间直接访问和传递数据,无需额外的传递方式或参数。
      • 可动态修改:可以在页面运行时修改公有成员的值,实现动态传递和更新数据。
    • 缺点:
      • 全局可见性:公有成员对外可见,可能导致数据的访问权限和安全性问题。
      • 数据耦合性:使用公有成员进行传值会增加页面间的耦合性,降低代码的灵活性和可重用性。
  3. 利用 Tag 属性进行传值:

    • 优点:
      • 内置属性:Tag 属性是控件的内置属性,无需额外定义或初始化,可以直接使用。
      • 灵活性:Tag 属性可以存储任意类型的数据,适用于简单的数据传递需求。
    • 缺点:
      • 类型限制:由于 Tag 属性是对象类型,需要进行类型转换才能使用其中的具体数据。
      • 语义模糊:Tag 属性本身没有明确的语义,可能导致数据的含义和用途不清晰。
  4. 在父页面定义公有成员并设置子页面的所有者:

    • 优点:
      • 父子关系:通过设置子页面的所有者,可以建立页面间的父子关系,方便数据传递和访问。
      • 生命周期管理:父页面可以管理子页面的创建、销毁和传递数据的时机,实现数据的统一管理。
    • 缺点:
      • 页面耦合性:父页面和子页面之间存在强耦合关系,可能导致页面间的依赖性增加,不利于解耦和单独测试。
      • 层次限制:该方法只适用于具有明确层次关系的页面结构,不适用于非父子关系的页面传值。
  5. 使用静态变量进行值的传递:

    • 优点:
      • 全局可访问:静态变量可以在整个应用程序域范围内访问,方便在不同页面之间传递数据。
      • 生命周期长久:静态变量的生命周期与应用程序保持一致,数据可以长时间保持,方便在不同页面间共享和使用。
    • 缺点:
      • 全局可见性:静态变量对整个应用程序可见,可能导致数据的访问权限和安全性问题。
      • 潜在的数据冲突:静态变量的全局可见性可能导致多个页面同时修改变量的值,需要进行线程同步和数据一致性的处理。

根据实际需求和具体情况,可以选择合适的方法进行值的传递。需要考虑数据的复杂性、安全性、耦合性、灵活性和代码可维护性等方面的因素。不同的场景可能适合使用不同的传值方式,综合权衡各种因素选择最合适的方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值