从子表单更改父表单属性的正确方法是什么?

2024-02-13

我只是想知道我是否以正确的方式这样做。我有两个表单,一个父表单和一个子表单(选项对话框)。要从子表单更改父表单中的属性,我使用如下代码:

// Create an array of all rich textboxes on the parent form.
var controls = this.Owner.Controls.OfType<RichTextBox>();

foreach (var item in controls) {
    if (chkDetectUrls.Checked)
        ((RichTextBox)item).DetectUrls = true;
    else
        ((RichTextBox)item).DetectUrls = false;
}

我的表单上只有一个 RichTextBox。必须循环遍历 1 个控件的数组似乎很愚蠢。这是正确的方法还是有更简单的方法?


更改父窗体中的属性根本不合适。相反,您的子窗体应该引发父窗体侦听的事件,并相应地更改其自身的值。

从子窗体操作父窗体会创建双向耦合 - 父窗体拥有子窗体,但子窗体也对父窗体有深入的了解和依赖。冒泡是对此的既定解决方案,因为它允许信息向上流动(“冒泡”),同时避免任何严格的耦合。

这是最基本的事件示例。它不包括在事件中传递特定信息(这是您可能需要的),但涵盖了概念。

在您的子表单中:

//the event
public event EventHandler SomethingHappened;

protected virtual void OnSomethingHappened(EventArgs e)
{
    //make sure we have someone subscribed to our event before we try to raise it
    if(this.SomethingHappened != null)
    {
        this.SomethingHappened(this, e);
    }
}

private void SomeMethod()
{
    //call our method when we want to raise the event
    OnSomethingHappened(EventArgs.Empty);
}

在你的父母表格中:

void OnInit(EventArgs e)
{
    //attach a handler to the event
    myChildControl.SomethingHappened += new EventHandler(HandleSomethingHappened);
}

//gets called when the control raises its event
private void HandleSomethingHappened(object sender, EventArgs e)
{
    //set the properties here
}

正如我上面所说,您可能需要在您的活动中传递一些特定信息。我们可以通过多种方法来做到这一点,但最简单的一种是创建您自己的 EventArgs 类和您自己的委托。看起来您需要指定某个值是否设置为 true 或 false,所以让我们使用它:

public class BooleanValueChangedEventArgs : EventArgs
{
    public bool NewValue;

    public BooleanValueChangedEventArgs(bool value)
        : base()
    {
        this.NewValue = value;
    }
}

public delegate void HandleBooleanValueChange(object sender, BooleanValueChangedEventArgs e);

我们可以更改我们的事件以使用这些新签名:

public event HandleBooleanValueChange SomethingHappened;

我们传递自定义的 EventArgs 对象:

bool checked = //get value
OnSomethingHappened(new BooleanValueChangedEventArgs(checked));

我们相应地更改父级中的事件处理:

void OnInit(EventArgs e)
{
    //attach a handler to the event
    myChildControl.SomethingHappened += new HandleBooleanValueChange(HandleSomethingHappened);
}

//gets called when the control raises its event
private void HandleSomethingHappened(object sender, BooleanValueChangedEventArgs e)
{
    //set the properties here
    bool value = e.NewValue;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从子表单更改父表单属性的正确方法是什么? 的相关文章

随机推荐

  • 如何从 Web api 控制器返回文件?

    我正在使用 MVC 5 Web Api 控制器 我想返回一个文件 Route public HttpResponseMessage GetFile var statusCode HttpStatusCode OK FileStream fi
  • jQuery 倒计时有问题吗?函数serverSync:服务器时间

    serverSync serverTime函数从服务器返回值 但我检查了服务器和客户端时间是否相同 当我调用服务器与服务器同步时 它不会显示倒计时 帮我 function var shortly new Date var newTime n
  • SQL更新记录,每次从1开始递增值

    我使用单个插入语句将批量记录添加到表中 我希望为每个新批次分配递增的数字 但每次都从 1 开始 所以 如果我有 Batch Name IncementingValue 1 Joe 1 1 Pete 2 1 Andy 3 2 Sue 1 2
  • Scrapy好像没有做DFO

    我有一个网站 我的爬虫需要遵循一定的顺序 例如 在开始进行 a2 之前 它需要先进行 a1 b1 c1 等操作 a b 和 c 中的每一个都由不同的解析函数处理 并且相应的 url 在 Request 对象中创建并生成 下面粗略地说明了我正
  • 不允许的参数嵌套属性 -rails

    我正在尝试向 2 个表提交表单 但不知何故我收到了此语法错误unexpected n 在这条线上joins sources landslide id and found unpermitted parameter sources在滑坡参数中
  • 无法从 Sequel gem 连接 mysql

    当我尝试从 Sequel 连接到 MySQL 时 我收到这些错误 require rubygems require sequel DB Sequel connect adapter gt mysql user gt root host gt
  • DependencyProperty 未在 NotifyCollectionChanged 事件上通知 UI

    我正在使用一个自定义控件 该控件具有选定的项目依赖属性 我已将其连接到集合更改事件 但未通知 UI 并且 PropertyChanged 事件始终为空 通常我会说这是一个数据上下文问题 但我无法更改控件上的数据上下文 因为不会显示任何数据
  • 如何使用Matlab的bsxfun求解累加和

    我有以下 慢 代码 A is n by m matrix B is n by m by d matrix C is n by m by d matrix R is 1 by d vector A zeros n m for i 1 d A
  • 将 XML 实体保留在输出中 (jSoup)

    我正在使用 jsoup 进行一些 xml 处理 问题是 它正在替换 xml 实体 即 187 与 html 实体 raquo 我如何保留原始 xml 实体 常规脚本 import org jsoup Jsoup import org jso
  • Vue 警告客户端渲染的虚拟 DOM 树与服务器渲染的内容不匹配

    我正在尝试使用 Vue js 和 Nuxt 在表中循环 tr 但是当我加载页面时出现以下错误 vue runtime esm js 2b0e 619 Vue warn 客户端渲染 虚拟 DOM 树与服务器渲染的内容不匹配 这是 可能是由不正
  • Eclipse 停止编译 RenderScript 文件

    我的 Android 项目中有一个 RenderScript rs 文件 SomeScript rs 在我开发它的过程中 它运行得很好 但后来我在 Eclipse 中清理了工作区 现在它似乎没有将该文件识别为 RenderScript 文件
  • Symfony:错误:尝试调用函数“ctype_digit”

    我尝试在服务器上安装 Symfony 3 3 项目时遇到错误 我正在使用 Apache HTTP 服务器和 PHP 7 0 当我访问 app dev php 时 它显示该错误 UndefinedFunctionException Attem
  • 如何删除旧的不需要的设备?

    所以这与我之前发布的问题有关 如何删除4 3模拟器 https stackoverflow com q 10834817 96716 我愚蠢地安装了 iOS 5 0 模拟器 现在我上一篇文章中提供的技术不起作用了 当您删除 5 0sdk 然
  • 自定义语言的 Gradle 插件

    我有一种自定义语言 假设它是 MyLang 但它可以是任何语言 我想为其制作一个插件 该插件需要 能够识别 DSL 给定语言的源集 能够使用可执行文件 编译器 来编译它们 我能够创建一个带有编译任务 还为空 的插件 并使用 Language
  • 将 XWPFRun 拆分为多个运行

    我正在尝试修改existingWord 文档自动将其中的某些关键字加粗 举个例子 敏捷的棕色狐狸跳过了懒狗 1 会成为 快速棕色fox跳过懒惰者dog 2 我的问题是 1 是一次运行 2 变成 5 次运行 5 作为狗后面的句点不是粗体 但它
  • netty中非阻塞通道中的SO_TIMEOUT

    如果通道在超时毫秒内未收到读取 响应 SO TIMEOUT 是否会使非阻塞通道过期 bootstrap group workerGroup channel NioSocketChannel class handler channelInit
  • JBoss 5.0.1 上的 servlet jar 文件在哪里?

    大家好 我正在尝试设置要在 JBossAS 5 0 1 上运行的构建文件 并且我需要找到应该用于构建的 servlet jar 文件 我看过的所有网页似乎都表明该文件是 javax servlet jar 并且它应该位于 C server
  • 尝试播放音频 (.wav) 文件时没有声音

    我有一个非常简单的类 可以使用以下代码播放声音文件 import java io File import java io IOException import javax sound sampled AudioSystem import j
  • Vuetify 数据表不显示数据

    Vuetify 数据表不显示数据 显示显示了 1 行中的 1 行 但表体为空 我的组件代码
  • 从子表单更改父表单属性的正确方法是什么?

    我只是想知道我是否以正确的方式这样做 我有两个表单 一个父表单和一个子表单 选项对话框 要从子表单更改父表单中的属性 我使用如下代码 Create an array of all rich textboxes on the parent f