【问题标题】:How can I handle enabling/disabling toolstrip buttons when form state changes without using a Select Case statement?当表单状态更改而不使用 Select Case 语句时,如何处理启用/禁用工具条按钮?
【发布时间】:2010-12-28 10:39:23
【问题描述】:

我们都知道,当表单状态发生变化时,可以通过在 C# 中使用 Select Case 语句 (VB.NET) 或 switch case 语句来处理启用/禁用 ToolStrip 按钮。

但我记得我的老师说过“在使用 OOP 开发软件时,使用这些语句不是正确的方法”。

Private Sub SetToolStripButtons()
    Select Case formState
        Case FormStates.Normal
            btnSave.Enabled = False
            btnCancel.Enabled = False
            btnNew.Enabled = True
            btnEdit.Enabled = True
        Case FormStates.Edit
           btnSave.Enabled = True
            btnCancel.Enabled = True
            btnNew.Enabled = False
            btnEdit.Enabled = False
        '.....
        '.....
    End Select
End Sub 

编辑:我在上面放了一个简单的代码sn-p

那么你会推荐什么呢?

【问题讨论】:

  • 你有一个小例子要展示吗?

标签: .net winforms oop design-patterns state


【解决方案1】:

好吧,代码看起来是有效的。我认为使用 Select Case 没有问题。 但是,如果您只有两种状态(正常和编辑),您可以像这样改进您的代码:

btnSave.Enabled = (formState = FormStates.Edit)
btnCancel.Enabled = (formState = FormStates.Edit) 
btnNew.Enabled = (formState <> FormStates.Edit) 
btnEdit.Enabled = (formState <> FormStates.Edit) 

【讨论】:

    【解决方案2】:

    你看过state design pattern吗?

    您将有一个抽象类来表示状态FormState,它将包含一个虚拟SetToolStripButtons() 方法:

    然后该类的每个派生实现负责了解如何设置每个按钮的可见性(对于给定状态)。例如,FormStateNormal 类将覆盖 SetToolsStripButtons 以包含如下内容:

    btnSave.Enabled = True
    btnCancel.Enabled = True
    btnNew.Enabled = False
    btnEdit.Enabled = False    
    

    不仅如此,还有更多内容,但希望这应该是一个很好的起点。

    【讨论】:

    • 非常感谢您能否发送一个您指出的示例?
    • 我还想看到一个适用于这个问题的例子。 (一年后)。
    【解决方案3】:

    您可以将编辑模式存储在 Boolean 中,然后设置 enable= this Boolean eg:(设置编辑模式为“真”,否则设置为“假”,然后调用该函数)

    dim isEdit as Boolean
    
    private sub SetToolStripButtons() 
       btnSave.Enabled = isEdit
       btnCancel.Enabled = isEdit
       btnNew.Enabled = Not isEdit
       btnEdit.Enabled = Not isEdit
    End Sub 
    

    【讨论】:

      【解决方案4】:

      以下是我的解决方案:

      1. 工具条控件中的项目单击事件(工具条按钮)a 2. 选择大小写用于识别其文本按下的按钮,然后是 将 lockcode 字符串传递给方法 lockToolStripItems()
      2. lockToolStripItems("lockcode") 然后该方法将处理是否通过将传递的参数转换为 char 数组然后 执行for循环以锁定或解锁控件,请注意1或0是我使用的字符1 = Enabled = true,0 = .Enable = false。如果是未知字符则返回错误提示框,注意方法中的x变量有3个用途,A.for语句中的计数器,B.char数组索引,C.工具条项索引

      就这么简单,只需 3 个步骤,希望对您有所帮助。

      Private Sub ToolStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles mnuStripDeliveryNote.ItemClicked
      
                  Select Case e.ClickedItem.ToString
      
                              Case "&New"
      
                                  lockToolStripItems("10")
      
                              Case "&Edit"
                                  lockToolStripItems("01")
      
                          End Select
                      End Sub
      
          Private Sub lockToolStripItems(ByVal mylockCode As String)
                      Dim myChar As Char
                      For x = 0 To 1
                          myChar = mylockCode.Chars(x)
                          If myChar = "1" Then
                              mnuStripDeliveryNote.Items(x).Enabled = True
                          ElseIf myChar = "0" Then
                              mnuStripDeliveryNote.Items(x).Enabled = False
                          Else
                              MsgBox("Error on parameter" & myChar & "" & x)
                          End If
                      Next
                  End Sub
      

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 2013-04-23
        • 2019-04-13
        • 1970-01-01
        • 2016-06-22
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        相关资源
        最近更新 更多