1

我目前有一个包含 10 个字符的变量,可以是 1 也可以是 0,每个字符都代表一个权限密钥。

现在,由于我的程序中也嵌入了 UAC 面板,我希望能够通过基于该键启用/禁用功能来控制谁可以做什么。

键的一个例子是:1011001101.

我用来更改人们的键的控件是一个包含 10 个复选框的列表。

例如1000000000,只会控制 UAC,所有其他功能都可以通过选中 UAC 中相应的复选框并更新密钥来启用。

当我选择不同的用户时,我应该如何处理基于权限键自动填充复选框的问题?

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

UAC面板

编辑:只是想我应该给你们一个清楚的例子来说明我正在尝试做什么,所以我编写了这段庞大的代码,我知道它会起作用,但实际使用它会对性能造成太大影响在我的程序中是这样的:

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
4

3 回答 3

2

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

取而代之的是整数 717,而不是“1011001101”。如果您想对照“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))
于 2013-04-16T20:48:01.223 回答
0

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

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

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


它会是这样的:

您将声明列表:

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
于 2013-04-16T20:41:29.620 回答
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
于 2013-04-16T23:11:21.517 回答