2 回答
TA贡献1856条经验 获得超11个赞
控件之间的交互有多种解决方案。控件是类,并且与任何其他类一样,它们可以使用其公共属性和方法或使用某些中介来相互交互。
在这种情况下,您的控件不需要相互了解,也不需要直接相互交互:
他们可以要求另一个知道这两个控件的对象来为他们完成这项工作。
或者他们可以提出他们的请求通知,订阅该通知的人将提供它。
要让另一个对象为他们做这项工作,您有多种解决方案。例如,您可以在父窗体和子控件中实现特定接口,将父级强制转换为该特定接口并调用为您完成工作的特定方法。
为了提高请求通知,一个简单的解决方案是依赖事件。您可以在子控件中创建一个事件,并在您需要父控件为您做某事时引发它。然后在父母中订阅该事件并完成工作。
示例 - 使用事件
我假设你有UserControl1
内部Button1
并且你已经处理Click
了Button1
. 然后您可以创建Button1Clicked
事件并在单击时引发它Button1
:
public event EventHandler Button1Clicked;
private void Button1_Click(object sender, EventArgs e)
{
Button1Clicked?.Invoke(this, e);
}
然后在父表单中,订阅事件并做任何你想做的事情:
private void userControl11_Button1Clicked(object sender, EventArgs e)
{
//Hide userControl11 and show userControl21
}
示例 - 使用界面
我假设,您有一个具有一些标准方法的接口:
public interface IDoSomething
{
void DoSomething();
void DoSomethingElse();
}
你已经在你的父表单中实现了接口:
public class Form1: Form, IDoSomething
{
// ...
public void DoSomething()
{
//Hide userControl11 and show userControl21
}
public void DoSomethingElse()
{
// ...
}
}
然后在您的用户控制中:
private void Button1_Click(object sender, EventArgs e)
{
var f = FindForm() as IDoSomething;
if(f!=null)
f.DoSomething();
}
TA贡献1836条经验 获得超5个赞
我想稍微扩展一下 Reza Aghaei 的回答。我认为它可以变得比现在更好。
第一种方法
如果我是你,我会有一些接口ICheckedView
,它至少有 1 种方法来实现,如下所示:
ICheckedView{ void Continue();}
现在,我们可以将此接口应用于解决方案中的任何类,但最有可能是视图。接下来,我会让你的主窗体实现这个接口并实现所需的方法。在这种情况下,我们希望我们的主窗体从面板中删除控件并添加一个新控件。坦率地说,我们的安全检查控件不需要(也许不应该)知道其他控件或接下来会发生什么。它仅用于控制流。
最后,您需要为 Safety_Check添加一个公共属性,甚至可能是一个参数,ICheckedView
其中包含一个参数。当您的安全检查控件被点击时,它可以告诉任何被传递给它的人(我们会说客户端)它必须继续。
第二种方法
它可以通过动作委托来完成。
如果您Action
在安全检查中添加一个委托,您可以直接弹出签名与该委托匹配的任何方法 ( void methodName()
)。您的 Safety_Check 控件的构造函数应包含一个 Action,并且该 Action 将被分配给该类的私有字段。然后,当需要调用时,可以直接调用该操作。
此方法的注意事项
因为我们可能首先从 UI 线程调用,所以我们可能没问题,但是您需要在这里考虑线程安全。调用所需模式可以帮助您解决这个问题。
- 2 回答
- 0 关注
- 78 浏览
添加回答
举报