在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开发框架基础上进行的参数传递案例界面如下所示。

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

时间: 2024-09-30 21:57:33

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

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

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

WinForm界面中快捷键设置

这是对整个界面的快捷键的设置,比如查询,保存. 1 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 2 { 3 if (keyData == Keys.F2) 4 { 5 if (btnSelect.Enabled) 6 { 7 btnSelect_Click(null, EventArgs.Empty); 8 return true;//这里return true 否则控件焦点会跟着方向键改变 9 } 1

C# winform 使用DsoFramer 创建 显示office 文档

使用微软DsoFramer 组件创建,显示office 1. DsoFramer  组件的介绍 dsoframer是微软提供一款开源的用于在线编辑.调用Word. Excel .PowerPoint等的ActiveX控件.国内很多著名的OA中间件, 电子印章,签名留痕等大多数是依此改进而来的. 2. C# winform 或者web 显示 开发的方式下载 DsoFramer 下载的界面如下: 使用就是这以上的两个dll 代码: public partial class Form1 : Form 

在IOS中实现导入&amp;导出文档

导入&导出文档时IOS开发者经常面临的开发需求.例如你开发一个文档阅读器允许用户导入他的文档到你的应用中以便离线阅读.又如,你的阅读器可以导出文档以便其他应用使用. 这篇文章,将介绍各种IOS开发中使用的文档导入&导出技术. 1.创建应用 像通常那样,我将用一个例子来说明.打开Xcode,创建一个View-based Application(iPhone)工程,并且命名为“OfflineReader” 双击OfflineReaderViewController.xib打开它,利用以下的vi

如何在ASP.NET Core 中快速构建PDF文档

比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间. 在本文中我们将要使用DinkToPDF来处理我们在.NET Core Web 程序中进行构建PDF文档!就现在我们不多说,直接开始有趣的部分. 前言 您可以通过创建PDF文档在我的仓库中,获取源代码,欢迎给个免费的Star... 现在我们创建一个.NET Core 3.0 项目,至于是mvc.Api.这

eclipse中自动生成javadoc文档的方法

?这篇文章主要介绍了eclipse中自动生成javadoc文档的方法,是实用eclipse开发Java程序时非常实用的技巧,对于进行Java项目开发具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例讲述了eclipse中自动生成javadoc文档的方法.分享给大家供大家参考.具体方法如下: 使用eclipse生成文档(javadoc)主要有三种方法: 1. 在项目列表中按右键,选择Export(导出),然后在Export(导出)对话框中选择java下的javadoc,提交到下一步. 在Jav

DRF中自动生成API文档

自动生成api文档(不管是函数视图还是类视图都能显示) 1.安装rest_framework_swagger库 pip install django-rest-swagger 2.在项目下的 urls.py 中加入如下: from rest_framework_swagger.views import get_swagger_view schema_view = get_swagger_view(title='API文档') urlpatterns += [ path(r'docs/', sch

Abp中SwaggerUI的接口文档添加上传文件参数类型

在使用Swashbuckle上传文件的时候,在接口文档中希望看到上传控件,但是C#中,没有FromBodyAttribute这个特性,所以需要在运行时,修改参数的swagger属性. 首先看下,最终效果: 下面介绍实现. 实现原理,通过swagger提供的filter,找到action中带有SwaggerFileUpload特性的参数,然后给swagger operaion.parameters添加一个自定义的参数,即文件类型参数即可. (1)定义SwaggerFileUploadAttribu

Python抓取单个网页中所有的PDF文档

Github博文地址,此处更新可能不是很及时. 1.背景 最近发现算法以及数据结构落下了不少(其实还是大学没怎么好好学,囧rz),考虑到最近的项目结构越来越复杂了,用它来练练思路,就打算复习下数据结构与算法.结合最近在学英语,然后干脆就用英文喽.然后选定一本参考书籍<Data Structures and Algorithms in Java>.刚开始看还是蛮吃力的,慢慢来.由于之前有翻录书籍附录的习惯,于是就去书籍附带的官网看了下,发现http://ww0.java4.datastructu