【问题标题】:Hide a usercontrol in a usercontrol from another form从另一个窗体隐藏用户控件中的用户控件
【发布时间】:2017-04-25 19:35:39
【问题描述】:

我有一个名为Meeting 的用户控件,它位于Form2 内的用户控件P2 内。从Form1 我在P2 中调用一个名为Update 的函数:

public void Update1()
{
    meeting1.Visible = false;
}

所以我从表格 1 开始使用:

    P2 p = new P2();
    p.Update();

它什么也不做。如果我直接使用 P2 中的函数,它可以工作,但如果我尝试从 Form1 使用它,它就不起作用。如果我在函数内添加MessageBox,MessageBox 可以工作,但有关meeting 的代码不起作用。

【问题讨论】:

  • 好的,你有一个P2 的实例。如果它自己调用Update(),就会发生这种情况。现在你创建一个完全不同的P2 的新实例,你知道它是新的,因为你说new P2() 来创建它。当您为此调用Update() 时,您不会在另一个P2 上调用Update()。你看到了吗?
  • 嗯,我明白了。那么我应该如何进行呢?
  • 是什么创建了Form2?他需要保留对它的引用并将其公开以供Form1 使用。如果Form1 创建它,那很容易。
  • Form2 是我按 F5 时运行的标准 WinForm
  • 那么Form1是谁创建的?

标签: c# forms winforms


【解决方案1】:

这就是我要做的:给 Meeting 一个 UpdateButtonAction 属性。我们将让它假装它从未听说过 P2,因为依赖关系或其他原因。

public Action UpdateButtonAction { get; set; }

在 P2 的构造函数的末尾,将 this 赋值给它。

this.meeting1.UpdateButtonAction = () => this.Update();

然后我们也给Form1一个相同的属性:

public Action UpdateButtonAction { get; set; }

我们有两个 action 属性副本,因为我假设您此时尚未创建 Form1 的实例。如果你有,那就简化了事情。

我不知道 Form1 何时尝试这样做;这听起来像是一个更新按钮之类的东西,但如果我猜错了我们可以改变它。

所以当Meeting 创建Form1 时,它会传递其父P2 提供的UpdateButtonAction 操作。这段代码在 Meeting 中的某个地方(我猜它是如何创建 Form1 的,如果这不能很好地适应你的实际工作,请告诉我):

var form1 = new Form1();

form1.UpdateButtonAction = this.UpdateButtonAction;

//  Or whatever
form1.ShowDialog();

Form1 可以随意调用该操作。这一行将调用在 P2 的构造函数中分配的 Action lambda。

this.UpdateButtonAction?.Invoke();

你也可以以同样的方式传递对P2的引用,但这更好,因为OOP等。

【讨论】:

  • this.P2.meeting1.UpdateButtonAction = () => this.Update();行的类型等中不存在类型名称'meeting1'
  • Form2 拥有一个P2 的实例,对吧? P2 的那个实例叫什么?仔细想想,应该是p21吧?
  • P2 拥有 meeting1,但自动完成仅在 this.P2. 之后显示 4 个 Control 和 Docks 内容
  • 是的,它是 p21,但我不会写 p21。它不会在自动完成时显示并给我一个错误
  • 听起来p21 实际上是Form2 以外的其他成员。你在 in Form2 做这个,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 2011-11-11
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多