在 C# 中调用父表单中的方法并访问父表单中的 gui 元素的最佳实践

2023-11-21

我正在开发一个 win 表单应用程序,我发现自己经常需要访问父表单中的方法,例如来自另一个类的 Form1,无论是表单类还是只是一个类。我的 form 1 的构造函数中有一些初始值设定项,因此我无法创建 Form1 的实例。所以我无法访问 Form1 的方法。

所以我觉得这是一个不好的做法。但是,在某些情况下我不知道还能做什么,例如考虑这种情况。我有一个名为 ProcessData 的类,其中有一个接收文件、逐行读取并处理数据的方法。现在我将此方法作为主窗体 Form1 中的线程调用。我的要求是作为数据处理,我想在主窗体 Form1 的多行文本框中显示当前正在处理的行。

以前我所做的一切都在同一个 Form1 中,所以我使用了委托,例如

delegate void SetTextCallback(string text, Control ctrl);
private void SetText(string text, Control ctrl)
    {
        if (ctrl.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text, ctrl });
        }
        else
        {
            if (ctrl.GetType() == typeof(Label))
            {
                ctrl.Text = text;
            }
            else
            {
                ctrl.Text += Environment.NewLine + text;
            }
        }
    }

我像 SetText("text",Label1); 一样调用它

但如果我从另一个类调用它来引用 Label1,我将需要 Form1 的实例,但我无法创建它,那么最好的做法是什么?

(我知道我可以将文本传递给 SetText 并在那里处理控件,但我将对从不同类调用的各种文本框和标签控件使用相同的东西)


我通常执行此操作的方法是让子表单公开与该表单上的逻辑操作和事件相对应的事件,例如:

/// <summary>
/// Occurrs when an item is selected in the form
/// </summary>
public event EventHandler<ItemSelectedEventArgs> ItemSelected;

/// <summary>
/// Fires the <see cref="ItemSelected" /> event
/// </summary>
protected void OnItemSelected(MyItem item) 
{
    var handler = this.ItemSelected;
    if (handler != null)
    {
        ItemSelectedEventArgs args = new ItemSelectedEventArgs();
        args.Item = item; // For example
        handler(this, args);
    }
}

这个想法是,父表单的逻辑应该响应子表单上的操作,而不是子表单上的操作驱动父表单上的操作 - 您应该尝试尽可能封装表单逻辑(也称为关注点分离) )。

另外,作为一种模式,它应该是父/调用形式,通过以下方式处理将调用编组到正确的线程InvokeRequired等等...而不是子表单 - 无论如何这都是不必要的,除非您正在后台线程上工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中调用父表单中的方法并访问父表单中的 gui 元素的最佳实践 的相关文章

  • 无法对 ContainsGenericParameters 为 true 的类型或方法执行后期绑定操作

    我有一个适用于所有实体的扩展 public static class EntityBaseExtensions public static T Clone
  • 使用 gcc 编译 C 时,预处理的 .i 文件中的数字意味着什么?

    我想了解编译过程 我们可以使用以下命令查看预处理器中间文件 gcc E hello c o hello i or cpp hello c gt hello i 我大致知道预处理器的作用 但我很难理解某些行中的数字 例如 1 usr incl
  • 将 LINQ to Entities 查询中的每个项目转换为接口的最佳方法是什么?

    我有一个实现 IUser 的实体对象 User IQueryable
  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • 在 C 中声明和初始化数组

    C 有没有办法先声明然后初始化数组 到目前为止 我一直在初始化一个这样的数组 int myArray SIZE 1 2 3 4 但我需要做这样的事情 int myArray SIZE myArray 1 2 3 4 在 C99 中 您可以使
  • CMake - 未定义参考

    我正在尝试将 gtest 包含到我的项目中 问题是我在 GTest 中收到未定义的引用错误 我正在尝试在 Gtest 中测试 Node 类 在节点的构造函数中 我使用类记录器 尽管我已将库记录器添加到 gtest target 中 但我仍然
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • 整数与双精度算术性能?

    我正在编写一个 C 类来使用整数执行 2D 可分离卷积 以获得比双对应更好的性能 问题是我没有获得真正的性能提升 这是 X 过滤器代码 对于 int 和 double 情况都有效 foreach pixel int value 0 for
  • 使用 MapViewOfFile 有什么限制吗?

    我正在尝试将内存映射文件用作 hFile CreateFile State Path GENERIC READ FILE SHARE READ FILE SHARE WRITE 0 OPEN EXISTING FILE FLAG SEQUE
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • C语言:如何获取使用strtok()一次后剩余的字符串

    我的字符串是 A B C D E 分隔符是 如何获取执行 strtok 一次后剩余的字符串 即 B C D E char a A B C D E char separator char b strtok a separator printf
  • C语言中如何将整数转换为字符? [复制]

    这个问题在这里已经有答案了 C语言中如何将整数转换为字符 C 中的字符已经是数字 字符的 ASCII 代码 无需转换 如果要将数字转换为相应的字符 只需添加 0 即可 c i 0 0 是 ASCii 表中的一个字符
  • Global.asax 错误处理程序或自定义 IHttpModule 错误处理程序未捕获未处理的异常

    我有一个类 DPCal EventMove 的一种方法 我想限制使用角色的访问 我有一个 Global asax cs 错误处理程序和一个自定义 IHttpModule 错误处理程序 旨在捕获未处理的异常 并将它们 Server Trans
  • 派生类的聚合初始化

    以下代码无法使用 Visual Studio2017 或在线 GDB 进行编译 我期望它能够编译 因为迭代器只是一个具有类型的类 并且它是从公共继承的 这是不允许的还是在 VS2017 中不起作用 template
  • C# 编译器编译 .txt .obj .java 文件

    using System class Program public static void Main Console WriteLine Hello World Console ReadLine 我将文件另存为1 java 2 obj an
  • 将函数作为函数参数传递

    Unity C 似乎无法识别Func lt gt 作为函数委托的符号 那么 如何将函数作为函数参数传递呢 我有一个想法Invoke functionName 0 可能有帮助 但我不确定它是否实际上立即调用该函数 或者等待帧结束 还有别的办法
  • 没有运算符“<<”与这些操作数匹配[重复]

    这个问题在这里已经有答案了 不知道发生了什么事 我查看了与此问题类似的其他帖子 但到目前为止没有解决方案有帮助 这是带有错误部分注释的代码 在某一时刻 它说 不起作用 而在代码的其余部分中 它说 include
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu
  • “保留供任何使用”是什么意思?

    注意 这是一个c questions tagged c问题 虽然我补充说c questions tagged c 2b 2b如果某些 C 专家可以提供 C 使用与 C 不同的措辞的基本原理或历史原因 在 C 标准库规范中 我们有这个规范文本

随机推荐

  • 如何在 PHP 中创建指定数量且全部等于指定数字的随机值?

    例如 假设我输入 10 作为值的数量 输入 10000 作为总金额 该脚本需要随机化 10 个不同的数字 全部等于 10000 不多也不少 但它也需要是动态的 例如 有时我可能会输入 5 或 6 甚至 99 作为值的数量 并输入任何数字 最
  • 如何在 Windows 上从 ffmpeg 获取实时视频帧和时间戳到 python

    寻找替代方案 因为 OpenCV 不会提供时间戳live相机流 在 Windows 上 这是我的计算机视觉算法所必需的 我找到了 ffmpeg 和这篇优秀的文章https zulko github io blog 2013 09 27 re
  • RequestDispatcher.forward() 与 HttpServletResponse.sendRedirect()

    之间有什么概念区别forward and sendRedirect 在 Web 开发领域 术语 重定向 是指向客户端发送一个空的 HTTP 响应 其中仅包含一个Location标头包含客户端必须向其发送全新 GET 请求的新 URL 所以基
  • (function (classes, fdef, mtable) 中的错误:无法找到签名“spec_tbl_df”的函数“select”的继承方法

    我的项目中出现此错误代码 奇怪的是 我今天早些时候使用的这段代码运行得很好 然而 由于我安装了 R 的更新 我现在在运行它时收到此消息 df1 lt df gt select Month Longitude Latitude Type Er
  • Gradle 构建期间序言中不允许出现内容

    我尝试了不同的方法 但问题没有解决 我什至重新安装了 android studio 但仍然遇到同样的问题 Fatal Error annotations 26 1 1 pom 2 1 Content is not allowed in pr
  • Vue - 深度观察对象数组并计算变化?

    我有一个名为people包含如下对象 Before id 0 name Bob age 27 id 1 name Frank age 32 id 2 name Joe age 38 它可以改变 After id 0 name Bob age
  • 此双重检查锁定修复有什么问题?

    所以我现在看到很多文章声称在 C 上双重检查锁定 通常用于防止多个线程尝试初始化延迟创建的单例 已被破坏 正常的双重检查锁定代码如下所示 class singleton private singleton private construct
  • numpy 中 itertools.combinations 的 N 维版本

    我想实施itertools combinations对于 numpy 基于这次讨论 我有一个适用于一维输入的函数 def combs a r Return successive r length combinations of elemen
  • 有没有一种简单的方法可以在 Visual Studio 中编写 UTF-8 八位字节?

    我有一个问题 我需要在 C 源代码中的标准 char 类型上使用 UTF 8 编码的字符串 如下所示 char twochars xe6 x97 xa5 xd1 x88 通常 如果我想编写 UTF 8 字符 我需要使用如上所述的八位字节 V
  • 非规范化数据

    我使用以下 R 代码将数据标准化为最小值和最大值 normalize lt function x return x min x max x min x mydata lt as data frame lapply mydata normal
  • .NET 类及其源代码

    当我编写 C 或任何 NET 程序 时 我使用方法和类 我使用的大部分代码都是从 NET 类调用方法 是否可以 纯粹出于好奇 查看这些类的实际源代码 我知道 MSDN 有完整的类 它们的属性和方法的列表 但我想看看代码 是的 浏览 NET框
  • Django 按点赞数最高的顺序排序

    我正在尝试创建一个页面 人们可以在其中看到评分最高的文章 但存在一个问题 当我过滤另一用户也喜欢的文章的点赞数时 它会创建已投票文章的副本 我想要的是按照点赞数最高的顺序对博客的文章进行排序 模型 py class Article mode
  • 使用 Realm.io 存储货币值

    我开始在我正在编写的 Android 应用程序中使用 Realm io 在我的一个数据对象中 我需要存储货币值 以前 我在内部将该值存储为 BigDecimal 值 然后在移入和移出数据库时也将其转换为双精度值 我总是被告知 由于处理货币值
  • TCP套接字客户端通过nodejs上的代理

    我需要与 smtp 服务器建立 tcp 套接字连接 是否可以通过nodejs上的代理服务器连接 有可用的 npm 模块吗 我根本找不到任何东西 var net require net var HOST 127 0 0 1 var PORT
  • Python 3 中的 Concurrent.futures 与多重处理

    Python 3 2 推出并发期货 这似乎是旧线程的一些高级组合多重处理模块 与旧的多处理模块相比 将其用于 CPU 密集型任务有哪些优点和缺点 本文表明他们更容易合作 是这样吗 我不会打电话concurrent futures更 先进 这
  • iOS 8.1.3 - 企业分发 - 应用程序缺少应用程序标识符权利

    我在 iOS 8 1 3 上使用 Enterprise Distribution 时遇到很多问题 我设法修复了大部分出现此错误的安装 Ignore manifest download already have bundleID 有了这个答案
  • 使用 Travis 调用 GitHub API 构建 Tag

    我在 GitHub 存储库中创建了一个 TravisCI Hook 它在推送到存储库后自动运行构建 我想补充的是 如果构建成功 则会自动创建一个标签 我发现有一种方法可以使用 GitHub API 创建标签http developer gi
  • Eclipse 无法运行:\.metadata\.log 错误

    我正在做一个Android项目 重新启动计算机后 eclipse无法运行 它抛出 metadata log 文件错误 Go to metadata plugins org eclipse core resources你会找到 snap文件
  • 如何获取 SSL 证书以在 Firefox 上使用本地主机

    我正在努力让一个网站在本地 apache 网络服务器上运行 当我单击网站中的某些链接时遇到错误 Firefox 显示 无法连接 错误页面 并在 URL 前面附加 https 我首先认为这是浏览器配置问题 并尝试了此处建议的所有解决方案 Fi
  • 在 C# 中调用父表单中的方法并访问父表单中的 gui 元素的最佳实践

    我正在开发一个 win 表单应用程序 我发现自己经常需要访问父表单中的方法 例如来自另一个类的 Form1 无论是表单类还是只是一个类 我的 form 1 的构造函数中有一些初始值设定项 因此我无法创建 Form1 的实例 所以我无法访问