【问题标题】:Windows form actions like close through custom user control code?Windows 窗体操作,例如通过自定义用户控件代码关闭?
【发布时间】:2018-04-06 17:23:38
【问题描述】:

我制作了一个包含五个控件的标题栏(自定义用户控件)。它们都是标签,但每个标签都做不同的“工作”。

例如,其中之一是退出表单按钮。例如,如果我将click 事件放入自定义用户控件的代码中...

Private Sub ExitButton_Click(sender As Object, e As EventArgs) Handles ExitButton.Click
    Close()
End Sub

我收到此错误...

BC30451 'Close' is not declared. It may be inaccessible due to its protection level.

另一方面,我无法将它放入我的项目代码中,因为它找不到 ExitButton 作为“隔离”控件并执行 close()

有什么建议吗?我也想用最小化、最大化等做同样的事情。

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    让我猜猜;您的按钮在用户控件中。你尝试在UserControl 类上调用Close(),这显然不是一个窗口并且没有它。

    有三种解决方案:

    • 使用ParentForm 属性并在其上调用Close()(例如ParentForm.Close())。简单但不太灵活;如果您想做除Form 基类(如Close())中实现的事情之外的其他事情,例如特定于主要形式,您必须先将其转换并检查它是否真的是您想到的形式。此外,所有这些都需要用PublicInternal 公开,不要公开你不必公开的内容。
    • 您将Form 传递给UserControl。太可怕了,因为传递东西最终会变成意大利面条式的代码。
    • 更好的是,通过UserControl 引发一个事件,您以UserControl 的形式处理该事件。这可能是最灵活的方法。

    这是一个用事件解决这个问题的小代码示例:

    打开UserControl 的代码并添加事件签名并在您单击按钮时引发该事件:

    Public Class MyUserControl
    
        Public Event ButtonClicked(sender As Object, e As EventArgs)
    
        Private Sub MyButton_Click(sender As Object, e As EventArgs) Handles MyButton.Click
            RaiseEvent ButtonClicked(sender, e)
        End Sub
    
    End Class
    

    然后,在您的Form 中,附加到UserControl 的ButtonClicked 事件:

    Public Class MyForm
    
        Private Sub MyUserControl1_ButtonClicked(sender As Object, e As EventArgs) Handles MyUserControl1.ButtonClicked
            Close()
        End Sub
    
    End Class
    

    如果对多个按钮重复使用该事件,则可以通过传递给该事件的sender 来检查它是哪个按钮。 (当然这可以通过只传递一个强制转换的Button 实例作为事件参数来优化,这只是一个简单的例子)。

    【讨论】:

    • 好的,让我刷新一下我的VB.NET语法知识,写一些事件处理代码,一会儿……
    • 我写了一些示例代码;如果您有任何问题,请随时提出。
    • 我猜这是因为我们后来添加了一个事件。问题是在设计器代码中没有使用 VB.NET 的哑 WithEvents 声明用户控件。我想您可以通过转到属性编辑器中的UserControl 的事件选项卡并双击出现在那里的ButtonClicked 事件来修复它(确保首先成功编译而没有导致错误的代码,否则它不会出现在列表中)。
    • 完成!!!当然使用第三种方式。非常感谢我的朋友,你是大师!!! :)
    • 请看看我自己的答案...你认为这应该是正确的答案吗?我并不是说你的错误,但我认为这更接近我最初寻找的内容......你怎么看?
    【解决方案2】:

    你是从哪里得到“接近”的?使用 application.exit() 退出应用程序

    【讨论】:

    • 我想关闭一个表单而不是整个应用程序!!!!我想对表单最大化、最小化等做同样的事情。
    • 答案也不完全正确,应用程序通常通过关闭主窗体退出。
    【解决方案3】:

    如果您想关闭应用程序,您可以使用: 应用程序.Exit() 如果要关闭表单: 我.Close()

    【讨论】:

      【解决方案4】:

      关闭你使用我的表单。

      我。关闭

      【讨论】:

      • 这并没有什么不同。在上面的示例中调用Close() 会隐式调用Me。问题是Me 不是表单。
      • 是的,因为您在继承自Form 的类中的方法中使用它;例如,就像按钮位于Form 上的按钮事件处理程序;在这个问题中它不在Form 上,所以我们没有那个方法。
      • 他需要以执行关闭并调用它的形式提供一个公共方法。
      • 你能举个简单的例子吗?
      • @Rabtok:那么他还需要将表单传递给用户控件;他实际上可以通过.Parent 访问它,但是当他将UserControl 移动到另一个容器中时,它就停止工作了(我不确定是否有.ParentForm 或其他东西,但我从不喜欢这种方法)。
      猜你喜欢
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 2015-01-18
      • 2017-10-19
      • 2017-11-30
      • 2014-09-03
      • 2020-02-19
      • 2013-04-04
      相关资源
      最近更新 更多