在Winform界面中实现对多文档窗体的参数传值

在Winform界面中窗体我们一般使用多文档进行展示,也就是类似一般的选项卡的方式可以加载多个窗体界面。一般来说,我们如果打开新的窗体,给窗体传递参数是很容易的事情,但是在框架层面,一般的窗体是通过动态创建的,一般传入窗体的类型,在多文档集合里面判断,如果存在则激活,如果不存在则创建的方式,所以我们传递参数会碰到一些问题。本文即使介绍如何在这种方式下,给窗体对象传递参数,从而实现相应的数据处理功能。

不管是主体界面中,左侧包含树形列表,还是顶部包含工具栏的情况,都可能涉及打开窗体的时候,传递一些初始化参数,方便窗体的更新显示的情况,这种的处理相对直接传值的方式需要复杂一点,我们可以通过接口、事件的方式进行处理,下面我来介绍一下整个实现的方式。

1、多文档窗体的构建或者激活

在我的Winform开发框架里面,我们加载多文档窗体的时候,都是统一采用一种方式来进行构建不存在或者激活已有窗体的,代码如下所示。

        private void tool_Purchase_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ChildWinManagement.LoadMdiForm(this, typeof(FrmPurchase));
        }

        private void tool_TakeOut_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ChildWinManagement.LoadMdiForm(this, typeof(FrmTakeOut));
        }

        private void tool_StockSearch_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ChildWinManagement.LoadMdiForm(this, typeof(FrmStockSearch));
        }

而这个LoadMdiForm的函数,主要判断多文档集合里面是否有对应的对象,没有这创建,有则激活显示即可,代码如下所示。

        /// <summary>
        /// 唯一加载某个类型的窗体,如果存在则显示,否则创建。
        /// </summary>
        /// <param name="mainDialog">主窗体对象</param>
        /// <param name="formType">待显示的窗体类型</param>
        /// <param name="json">传递的参数内容,自定义Json格式</param>
        /// <returns></returns>
        public static Form LoadMdiForm(Form mainDialog, Type formType, string json)
        {
            bool bFound = false;
            Form tableForm = null;
            foreach (Form form in mainDialog.MdiChildren)
            {
                if (form.GetType() == formType)
                {
                    bFound = true;
                    tableForm = form;
                    break;
                }
            }
            if (!bFound)
            {
                tableForm = (Form) Activator.CreateInstance(formType);
                tableForm.MdiParent = mainDialog;
                tableForm.Show();
            }

            tableForm.BringToFront();
            tableForm.Activate();

            return tableForm;
        }

这种方式构建的多文档界面如下所示。

2、多文档窗体传参数的实现处理

首先,为了实现这个方式,我们需要先创建一个接口,是我们窗体界面的基类,实现这个接口,然后在加载的时候,转换为对应的接口处理就可以了,具体接口代码如下所示。

    /// <summary>
    /// 使用ChildWinManagement辅助类处理多文档加载的窗体,在构建或激活后,触发一个通知窗体的事件,方便传递相关参数到目标窗体。
    /// 为了更加通用的处理,传递的参数使用JSON定义格式的字符串。
    /// </summary>
    public interface ILoadFormActived
    {
        /// <summary>
        /// 窗体激活的事件处理
        /// </summary>
        /// <param name="json">传递的参数内容,自定义JSON格式</param>
        void OnLoadFormActived(string json);
    }

这里参数为了通用,我们定义为字符串的JSON内容,方便实现更加强大的参数处理。

修改好这些,我们需要在基类窗体 BaseForm 实现这个增加的接口,如下所示。

    /// <summary>
    /// 常规界面基类
    /// </summary>
    public partial class BaseForm : XtraForm, IFunction, ILoadFormActived

实现这个接口很容易,为了更加方便业务窗体(继承自基类窗体BaseForm),我们提供一个事件进行处理,具体代码如下所示。

    /// <summary>
    /// 常规界面基类
    /// </summary>
    public partial class BaseForm : DevExpress.XtraEditors.XtraForm, IFunction, ILoadFormActived
    {
        /// <summary>
        /// 定义一个窗体激活后的处理委托类型
        /// </summary>
        /// <param name="json"></param>
        public delegate void FormActiveHandler(string json);
        /// <summary>
        /// 使用ChildWinManagement辅助类处理多文档加载的窗体,在构建或激活后,触发一个通知窗体的事件,方便传递相关参数到目标窗体。
        /// 为了更加通用的处理,传递的参数使用JSON定义格式的字符串。
        /// </summary>
        public event FormActiveHandler LoadFormActived;

同时,我们实现接口,就是直接调用事件就可以了,具体代码如下所示。

        /// <summary>
        /// 窗体激活的事件处理
        /// </summary>
        /// <param name="json">传递的参数内容,自定义JSON格式</param>
        public virtual void OnLoadFormActived(string json)
        {
            //默认什么也没做
            //如果需要处理传参数,则在这里处理参数Json即可
            if (LoadFormActived != null)
            {
                LoadFormActived(json);
            }
        }

这样我们就完成了基类窗体的处理了,前面我们介绍了动态构建加载窗体的时候,是使用了LoadMdiForm的函数,既然我们的接口实现了上面的ILoadFormActived接口,那么我们动态创建或者激活窗体的时候,那么就使用这个接口进行处理一下,以便实现对应事件的处理操作了。因此我们的窗体加载函数修改代码,如下所示。

        /// <summary>
        /// 唯一加载某个类型的窗体,如果存在则显示,否则创建。
        /// </summary>
        /// <param name="mainDialog">主窗体对象</param>
        /// <param name="formType">待显示的窗体类型</param>
        /// <param name="json">传递的参数内容,自定义Json格式</param>
        /// <returns></returns>
        public static Form LoadMdiForm(Form mainDialog, Type formType, string json)
        {
            bool bFound = false;
            Form tableForm = null;
            foreach (Form form in mainDialog.MdiChildren)
            {
                if (form.GetType() == formType)
                {
                    bFound = true;
                    tableForm = form;
                    break;
                }
            }
            if (!bFound)
            {
                tableForm = (Form) Activator.CreateInstance(formType);
                tableForm.MdiParent = mainDialog;
                tableForm.Show();
            }

            //窗体激活的时候,传递对应的参数信息
            ILoadFormActived formActived = tableForm as ILoadFormActived;
            if (formActived != null)
            {
                formActived.OnLoadFormActived(json);
            }

            tableForm.BringToFront();
            tableForm.Activate();

            return tableForm;
        }

还记得我们前面打开一个多文档窗体的代码,就是利用这个接口进行创建或者激活指定类型的窗体的,如下所示。

ChildWinManagement.LoadMdiForm(this, typeof(FrmItemDetail));

那么我们增加了新的函数参数Json后,我们如果需要传递一个指定的参数给对应的窗体,那么就修改下调用即可。例如下面,为了测试,我传入一个动态构建的类信息,然后转换为Json字符串信息给接收窗体,并进行加载窗体。

            //使用自定义参数调用
            var obj = new { ItemNo = "123456789", ItemName = "测试名称" };
            var param = JsonConvert.SerializeObject(obj, Formatting.Indented);

            ChildWinManagement.LoadMdiForm(this, typeof(FrmItemDetail), param);

前面我们介绍了基类窗体,已经实现定义了一个事件,并对这些通知的接口进行处理,具体如下所示。

那么我们前面加载的 FrmItemDetail  需要做哪些工作呢,就是实现对事件的处理即可,如下所示。

这样我们就能够通过实现对应的事件,把整个通知事件的处理处理完毕了,我们来看看最终的界面效果,如下所示,接收到的窗体事件后,会弹出一个提示对话框在右下角了。

当然实际上我们可以做的更多,如可以传递一些具体的信息,让它在界面上进行显示。

如其中一个客户基于我的Winform开发框架基础上进行的参数传递案例界面如下所示。

本文只是对其中在框架层面对不同多文档窗体的传值进行的一个研究探索和实现,其中的理念是基于常用的接口和事件驱动的方式进行处理,以期达到方便、高效的目的,如果您有更好的建议,也希望多多交流。

本文转自博客园伍华聪的博客,原文链接:在Winform界面中实现对多文档窗体的参数传值,如需转载请自行联系原博主。

时间: 2024-10-24 10:12:50

在Winform界面中实现对多文档窗体的参数传值的相关文章

Winform开发框架中的内容及文档管理模块功能介绍

在开发项目的时候,我们有一些场景需要编辑一些HTML文档,作为内容发布系统的一部分,有时候也需要对一些文档如WORD文档进行编辑管理,这样需要我们对这些内容及文档进行合适的管理.本文主要介绍在WInform项目中利用ZetaHtmlEditControl进行HTML内容管理,以及利用TX TextControl控件进行WORD文档管理,这两方面都是我们一般进行内容和文档管理所必须的. 1.内容及文档管理模块功能介绍 整个模块,支持WInform框架和混合式开发框架两种模式,都是基于WInform

Winform界面中实现通用工具栏按钮的事件处理

在一个给客户做的项目中,界面要求修改增加通用工具栏按钮的事件处理,也就是在主界面中放置几个固定的功能操作按钮,打开不同的页面的时候,实现对应页面的功能处理,这种和我标准的界面处理方式有所不同,标准的列表界面,一般在界面中放置了一些常规的按钮,如查询/更新.新建.编辑.删除.导入.导出等常规操作,现在是需要把这些提升到主界面的层次上放置按钮,这种处理方式也算是提供一种方便吧.本篇随笔介绍实现这个功能的思路和代码实现逻辑. 1.界面功能介绍 这里要实现的通用工具栏按钮的事件处理,具体的界面是这样的,

Winform界面中实现菜单列表的动态个性化配置管理

在我们一般的应用系统里面,由于系统是面向不同类型的用户,我们所看到的菜单会越来越多,多一点的甚至上百个,但是我们实际工作接触的菜单可能就是那么几个,那么对于这种庞大的菜单体系,寻找起来非常不便.因此对菜单的个性化配置就显得尤为重要,本篇随笔就是基于这样的理念,提供用户对可见菜单进行一个动态配置,只选自己喜欢.常用的菜单显示出来即可,菜单的配置存储在数据库里面,在不同的客户端体验都是一样.本篇随笔主要介绍实现这样的功能的一个完整思路,部分代码逻辑可供参考. 1. 菜单列表的动态个性化配置的过程 在

Winform界面中主从表编辑界面的快速处理

在Winform开发中,我们往往除了常规的单表信息录入外,有时候设计到多个主从表的数据显示.编辑等界面,单表的信息一般就是控件和对象实体一一对应,然后调用API保存即可,主从表就需要另外特殊处理,本随笔介绍如何快速实现主从表编辑界面的处理,结合GridControl控件的GridView控件对象,实现数据在列表中的实时编辑,非常方便. 1.主从表的界面设计及展示 主从表一般涉及两个以上的表,一个是主表,其他的是从表的,在实际情况下,一般包含两个表较多,我们这里以两个表的主从表关系进行分析处理.

如何在Word文档中显示过宽文档

在打开Word文档时,有时会发现因为文档过宽,屏幕上显示不全,这可怎么办?总不能看一行就拖动一次水平滚动条吧!这时我们可以重新调整行的宽度,使其适合文档窗口的大小. 在Word2003中显示过宽文档的方法 ①单击菜单栏中的"工具"选项中的"选项"命令.   ②在弹出的"选项"页面框中选择"视图"选项卡,然后在"大纲视图和普通视图选项"栏下选中"窗口内自动换行"复选框,最后单击"

如何在Word 2003中打开Word 2010文档

一般情况下,在Word 2010中创建的Word文档无法在Word 2003中打开和编辑,因为Word 2003无法识别扩展名为.docx的Word 2010文件,如图 2010081301所示. 图 2010081301 Word 2003无法识别.docx文件 为了使Word 2010文档能够在Word 2003中打开和编辑,用户可以在安装Word 2003的电脑中下载并安装Microsoft Office Word.Excel和Powerpoint 2007文件格式兼容包.操作步骤如下所述

如何在Word 2010中使用模板创建文档

除了通用型的空白文档模板之外,Word 2010中还内置了多种文档模板,如博客文章模板.书法字帖模板等等.另外,Office.com网站还提供了证书.奖状.名片.简历等特定功能模板.借助这些模板,用户可以创建比较专业的Word 2010文档.在Word 2010中使用模板创建文档的步骤如下所述: 第1步,打开Word 2010文档窗口,依次单击"文件"→"新建"按钮. 第2步,在打开的"新建"面板中,用户可以单击"博客文章".

WPS2013文字中为分栏文档中每栏插入页码的方法

  WPS2013文字中为分栏文档中每栏插入页码的方法          1.将文档分完栏之后,单击菜单栏--插入--页眉和页脚. 2.在编辑栏里面输入第页 共页,然后光标定位到第后面,连续2次按Ctrl+F9即可输入2次括号,按下图输入域代码. 3.选中域代码,按下F9,切换域代码,得到数字.然后完成后面的输入,不同的是代码变了. 4.下一页的也是差不多的方法,代码类似,读者可以举一反三,最后的效果如下所示:

在Word2010中使用模板创建文档

除了通用型的空白文档Word2010/list_19_1.html'>模板之外,Word2010中还内置了多种文档模板,如博客文章模板.书法字帖模板等等.另外,Office.com网站还提供了证书.奖状.名片.简历等特定功能模板.借助这些模板,用户可以创建比较专业的Word2010文档.在Word2010中使用模板创建文档的步骤如下所述: 第1步,打开Word2010文档窗口,依次单击"文件"→"新建"按钮.第2步,在打开的"新建"面板中,