我目前有一个包含10个字符的变量,分别为1或0,每个字符代表一个权限密钥。
现在,因为我也有UAC面板在我的程序嵌入,I'ld喜欢有能力控制谁可以enableing /基于该密钥去功能特性做什么的能力。
密钥的一个示例是:1011001101
。
用于更改人员密钥的控件是10个复选框的列表。
E.g。 1000000000
只会控制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
答案 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