我怎么能用最少量的代码实现这一目标?

时间:2013-04-16 20:29:03

标签: vb.net parsing

我目前有一个包含10个字符的变量,分别为1或0,每个字符代表一个权限密钥。

现在,因为我也有UAC面板在我的程序嵌入,I'ld喜欢有能力控制谁可以enableing /基于该密钥去功能特性做什么的能力。

密钥的一个示例是:1011001101

用于更改人员密钥的控件是10个复选框的列表。

E.g。 1000000000只会控制UAC,并且可以通过检查UAC中相应的复选框并更新密钥来启用所有其他功能。

当我选择其他用户时,我应该如何处理基于权限密钥自动填写复选框的问题?

注意:这是UAC面板现在所查找的截图,只是为了让您了解我的表单是如何设置的。

UAC panel

编辑:只是觉得我应该给你们的是什么,我试图做一个明显的例子,所以我写了这个庞大的一段代码,这是我知道的工作,但它会在我的程序中真正使用这样的性能影响太大了:

If Mid(pkeys, 1, 1) = "1" Then
            chkUAC.Checked = True
        End If
        If Mid(pkeys, 2, 1) = "1" Then
            chkPInv.Checked = True
        End If
        If Mid(pkeys, 3, 1) = "1" Then
            chkVInv.Checked = True
        End If
        If Mid(pkeys, 4, 1) = "1" Then
            chkCheck.Checked = True
        End If
        If Mid(pkeys, 5, 1) = "1" Then
            chkPMap.Checked = True
        End If
        If Mid(pkeys, 6, 1) = "1" Then
            chkVMap.Checked = True
        End If
        If Mid(pkeys, 7, 1) = "1" Then
            chkTele.Checked = True
        End If
        If Mid(pkeys, 8, 1) = "1" Then
            chkHeal.Checked = True
        End If
        If Mid(pkeys, 9, 1) = "1" Then
            chkDart.Checked = True
        End If
        If Mid(pkeys, 10, 1) = "1" Then
            chkWhiteList.Checked = True
        End If

3 个答案:

答案 0 :(得分:2)

这听起来像是按位比较但是使用字符串而不是整数。如果仍然可行,我建议切换到整数,以便您可以使用二元运算符进行检查。

不是拥有“1011001101”,而是使用整数717.如果你想检查“1000000000”(整数512),你可以这样做一个简单的检查:

' iPerm = 717, iUACMask = 512
chkUAC.Checked = CBool(iPerm And iUACMask)

如果iPerm包含iUACMask,则表达式将计算为非零值,结果为True。如果不匹配,则返回0.

如果无法再更改为整数,则可以对其进行实时转换。显然,性能将比使用整数开始时更差,但取决于可能不是问题的用途。

' strPerm = "1011001101", strUACMask = "1000000000"
chkUAC.Checked = CBool(Convert.ToInt32(strPerm, 2) And Convert.ToInt32(strUACMask, 2))

答案 1 :(得分:0)

我会按照您拥有权限密钥中的位的顺序创建一个List(Of CheckBox),其中包含对每个权限的引用复选框。

然后,当您的OnSelectedIndexChanged事件被触发时,您将获取所选用户的权限密钥并将其转换为char数组。

然后在迭代索引值时遍历该char数组,以便您可以将cbList[index].checked设置为等于当前char的布尔值。


这将是这样的:

您将声明List:

Dim cbList = New List(Of CheckBox)

你会在某处初始化它:

With cbList

    .Add(chkUAC)
    .Add(chkPInv)
    .Add(chkVInv)
    .Add(chkCheck)
    .Add(chkPMap)
    .Add(chkVMap)
    .Add(chkTele)
    .Add(chkHeal)
    .Add(chkDart)
    .Add(chkWhiteList)

End With

然后你会循环并分配索引已更改:

Protected Sub ddlUser_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlUser.SelectedIndexChanged

    Dim i = 0

    For Each c In ddlUser.SelectedValue.ToCharArray

        cbList(i).Checked = c = "1"
        i += 1

    Next

End Sub

答案 2 :(得分:0)

只需更改此代码

即可
For x = 0 To 9
  If pkeys(x) = "1" Then
    cbList(x).Checked = True
  Else
    cbList(x).Checked = False
  End If
Next

到此代码

For x = 0 To 9
  cbList(x).Checked = (pkeys(x) = "1")
Next