gpt4 book ai didi

c# - 从子窗体更改父窗体属性的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-30 00:29:04 24 4
gpt4 key购买 nike

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

// 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 类和您自己的委托(delegate)。看起来您需要指定某个值是设置为 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;
}

关于c# - 从子窗体更改父窗体属性的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1283100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com