【问题标题】:Custom Button - How to disable Click event?自定义按钮 - 如何禁用 Click 事件?
【发布时间】:2011-06-24 15:18:18
【问题描述】:

我有一个继承 Button 对象的类。我有一个简单的函数和 Click 的事件处理程序。当我把它放在另一个窗口窗体上时 - 完美!但是,我现在希望能够禁止用户在使用“点击”事件时选择它。希望这是有道理的。

为了澄清一下:我有一个自定义按钮,但我不希望用户能够在将 Click 事件放在表单上时对其进行编程。

我已经厌倦了,但是...我显然是 .NET 的新手

编辑:这是代码

Public NotInheritable Class clsRandomGenerator
Inherits Button

Protected Const ALPHA_UPPERCASE As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Protected Const ALPHA_LOWERCASE As String = "abcdefghijklmnopqrstuvwxyz"
Protected Const NUMERIC As String = "0123456789"
Protected Const SPECIAL_CHAR As String = "!@#$%^&*"
Protected Const ALPHA_NUMERIC As String = ALPHA_UPPERCASE & ALPHA_LOWERCASE & NUMERIC & SPECIAL_CHAR

Public Shared Function GetRandomPassword() As String
    Dim RandomData As String = String.Empty
    Dim intPosition As Integer = 0
    Dim intLength As Integer = 8
    Dim data As Byte() = New Byte(intLength) {}
    Dim charSetLength As Integer = ALPHA_NUMERIC.Length
    Dim randomize As RandomNumberGenerator = RandomNumberGenerator.Create()

    randomize.GetBytes(data)
    For index As Integer = 0 To intLength - 1
        intPosition = data(index)
        intPosition = intPosition Mod charSetLength
        RandomData = (RandomData + ALPHA_NUMERIC.Substring(intPosition, 1))
    Next
    Return RandomData
End Function

Private Sub clsRandomGenerator_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click

    MessageBox.Show(GetRandomPassword)

End Sub

【问题讨论】:

  • 您想在程序处理前一个请求时禁用该按钮吗?比如..用户点击按钮->按钮被禁用->程序执行任务->按钮被启用。
  • 没有。基本上我已经为我的控件后面的 Click 事件创建了代码。当我把它放在表单上时,我可以双击我的按钮并自动创建一个新的点击子例程(好吧,骨架)。这将允许用户添加他们自己的 Click 事件代码。我想要那个残疾人。这有帮助吗?
  • 好吧..我明白了。试试@Bueller 的解决方案:)

标签: .net controls


【解决方案1】:

我“认为”我明白你想要做什么。尝试覆盖 OnClick 事件并仅注释掉 MyBase.OnClick(e) 以防止它传递给客户端:

Public Class ButtonEx
  Inherits Button

  Protected Overrides Sub OnClick(e As EventArgs)
    'MyBase.OnClick(e)  'Eat it
    MessageBox.Show("Clicks from inside!")
  End Sub

End Class

然后从您的表单中:

Private Sub ButtonEx1_Click(sender As Object, e As EventArgs) Handles ButtonEx1.Click
  'This should not pop up:
  MessageBox.Show("Does this click?")
End Sub

【讨论】:

  • 这确实有效。我想我只是希望我可以覆盖 Button Click 事件并将其隐藏,以便用户甚至无法选择将他/她的任何代码放入 Click 事件中(即使用类名时:方法名称下拉列表,让 IDE 删除事件)。不过谢谢!
【解决方案2】:

如果我理解正确,您已经实现了从 Button 类派生的自定义按钮控件。作为自定义按钮的一部分,您实现了自己的单击事件处理程序,您不希望您控制的实现者能够覆盖。

如果没有看到代码,建议将您的课程标记为“密封”。这不一定会阻止某人使用您的按钮注册新的单击事件处理程序,但我们需要查看一些代码,也许需要更好地描述您要完成的工作才能真正帮助您。

编辑:

这可能会有所帮助。

C# pattern to prevent an event handler hooked twice

【讨论】:

  • 我确定这是正确的答案,但我对 C# 很不熟悉。我看了所有 3 篇文章,并不能理解太多。可悲的是,我什至使用了一个没有太大帮助的转换器。我想我在 .NET 方面比我想象的要落后很多,因为我对代码发生了什么只有一点点的了解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多