【问题标题】:Boolean Table in VB.Net - Select Case, If-Else, or Something else?VB.Net 中的布尔表 - 选择大小写、If-Else 还是其他?
【发布时间】:2010-10-12 20:39:21
【问题描述】:

我希望简化三项布尔表达式的处理。 “Select Case”似乎没有为三元值提供解决方案,并且 If 语句似乎有点多。它会按照我编码的方式工作,但是如果您对如何简化它有任何想法,我会很感激您的见解。如果没有,我希望这个 sn-p 可以为别人节省一点时间。

Public Sub SetThisFontStyle(ByRef theTextBox As RichTextBox, ByVal StyleToChange As String)

    'Get Initial Values:'
    Dim BoldState As Boolean = theTextBox.SelectionFont.Bold
    Dim ItalicState As Boolean = theTextBox.SelectionFont.Italic
    Dim UnderlineState As Boolean = theTextBox.SelectionFont.Underline

    'Find out what we re trying to change:'
    Select Case StyleToChange
        Case "Bold" : If BoldState Then BoldState = False Else BoldState = True
        Case "Italic" : If ItalicState Then ItalicState = False Else ItalicState = True
        Case "Underline" : If UnderlineState Then UnderlineState = False Else UnderlineState = True
        Case Else : Exit Sub
    End Select

    'Boolean Table just for reference:'
    '0 - 0 - 0 None'
    '1 - 0 - 0 Bold Only'
    '0 - 1 - 0 Italic Only'
    '0 - 0 - 1 Underline Only'
    '1 - 1 - 0 Bold and Italic'
    '0 - 1 - 1 Italic and Underline '
    '1 - 0 - 1 Bold and Underline'
    '1 - 1 - 1 Bold, Italic, and Underline'

    If Not BoldState And Not ItalicState And Not UnderlineState Then
        'Regular, without any styles'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Regular)
    ElseIf BoldState And Not ItalicState And Not UnderlineState Then
        'Bold Only'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Bold)
    ElseIf Not BoldState And ItalicState And UnderlineState Then
        'Italic Only'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Italic)
    ElseIf Not BoldState And Not ItalicState And UnderlineState Then
        'Underline Only'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Underline)
    ElseIf BoldState And ItalicState And Not UnderlineState Then
        'Bold and Italic'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Bold + Drawing.FontStyle.Italic)
    ElseIf Not BoldState And ItalicState And UnderlineState Then
        'Italic and Underline'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Italic + Drawing.FontStyle.Underline)
    ElseIf BoldState And Not ItalicState And UnderlineState Then
        'Bold and Underline'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Bold + Drawing.FontStyle.Underline)
    ElseIf BoldState And ItalicState And UnderlineState Then
        'Bold, Italic, and Underline'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Bold + Drawing.FontStyle.Italic + Drawing.FontStyle.Underline)
    Else
        Exit Sub
    End If

End Sub

【问题讨论】:

  • 您可以尝试将这三个结果视为一个三位数字并使用 switch 语句(这可能看起来更丑陋并且比您已有的更难维护)。

标签: vb.net if-statement select fonts boolean


【解决方案1】:

我会使用带有 [Flags] 属性的枚举,然后您可以检查组合。它还可以使代码更具可读性。

[Flags]
public enum TextSettingType
{
    None = 0x0,
    Bold = 0x1,
    Italic = 0x2,
    Underline = 0x3
}

对 C# 感到抱歉,不知道如何将其转换为 VB.Net

【讨论】:

    【解决方案2】:
     'Boolean Table just for reference:'
            '0 - 0 - 0 None' = 0
            '1 - 0 - 0 Bold Only' = 4
            '0 - 1 - 0 Italic Only' = 2
            '0 - 0 - 1 Underline Only' = 1
            '1 - 1 - 0 Bold and Italic' = 6
            '0 - 1 - 1 Italic and Underline' = 3
            '1 - 0 - 1 Bold and Underline' = 5
            '1 - 1 - 1 Bold, Italic, and Underline' = 7
    
            Dim bold As Boolean = False
            Dim italic As Boolean = False
            Dim under As Boolean = False
            Dim fNum As Byte
    
            If chkBold.Checked Then
                bold = True
            End If
            If chkItalic.Checked Then
                italic = True
            End If
            If chkUnder.Checked = True Then
                under = True
            End If
    
            fNum = ((4 * Convert.ToByte(bold)) + (2 * Convert.ToByte(italic)) + (1 * Convert.ToByte(under)))
            'MsgBox(fNum)
    
            Select Case fNum
                Case 0
                    ' Regular
                    txtEntry.Font = New Font("Arial", 12, FontStyle.Regular)
                Case 1
                    ' Underline
                    txtEntry.Font = New Font("Arial", 12, FontStyle.Underline)
                Case 2
                    ' Italic
                    txtEntry.Font = New Font("Arial", 12, FontStyle.Italic)
                Case 3
                    ' Italic and Underline
                    txtEntry.Font = New Font("Arial", 12, FontStyle.Italic Or FontStyle.Underline)
                Case 4
                    ' Bold
                    txtEntry.Font = New Font("Arial", 12, FontStyle.Bold)
                Case 5
                    ' Bold and Underline
                    txtEntry.Font = New Font("Arial", 12, FontStyle.Bold Or FontStyle.Underline)
                Case 6
                    ' Bold and Italic
                    txtEntry.Font = New Font("Arial", 12, FontStyle.Bold Or FontStyle.Italic)
                Case 7
                    'Bold, Italic, and Underline
                    txtEntry.Font = New Font("Arial", 12, FontStyle.Bold Or FontStyle.Italic Or FontStyle.Underline)
            End Select
    

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 2017-01-20
      • 2019-04-03
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多