2013-04-16 1 views
1

В настоящее время у меня есть переменная, содержащая 10 символов, либо 1, либо 0, каждая из которых представляет собой ключ разрешения.Как я мог достичь этого с наименьшим количеством кода?

Теперь, когда у меня также есть панель UAC, встроенная в мою программу, я хотел бы иметь возможность контролировать, кто может что-то делать, включив/отключив функции на основе этого ключа.

Примером ключа будет: 1011001101.

Управление, с помощью которого я меняю ключи людей, представляет собой список из 10 флажков.

E.g. 1000000000 предоставит только контроль над UAC, и все остальные функции могут быть включены, установив соответствующий флажок в UAC и обновив ключ.

Как я могу подойти к вопросу автоматического заполнения флажков на основе ключа разрешения при выборе другого пользователя?

Примечание. Вот скриншот о том, как выглядит панель UAC, только чтобы дать вам представление о том, как настроена моя форма.

UAC panel

EDIT: Просто думал, что я должен дать вам, ребята, наглядный пример того, что я пытаюсь сделать, так что я написал этот массивный кусок кода, который я знаю, будет работать, но это d слишком много удара по производительности на самом деле использовать в моей программе, как это:

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 
+1

меньше кода не всегда лучший код. – MarcinJuraszek

+0

Правда, но я обнаружил, что (в большинстве случаев) меньше кода означает меньше нагрузки на процессор/меньше шансов для AppHang. Кроме того, меньше управляемо – Yorrick

+0

В его комментарии говорится, что ваше наблюдение не всегда верно. В частности, манипулирование отдельными битами * не * будет быстрее, чем альтернативы. –

ответ

0

я хотел бы сделать List(Of CheckBox), который содержит ссылку на каждое разрешение флажок в том порядке, что у вас есть биты в ключе разрешения.

Затем, когда вы запускаете событие OnSelectedIndexChanged, вы берете ключ разрешения выбранного пользователя и преобразуете его в массив символов.

Затем пропустите этот массив символов, итерации значения индекса, чтобы вы могли установить cbList[index].checked равным логическому значению текущего символа.


Было бы что-то вроде этого:

Вы бы объявить список:

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 
+0

Хмм, у каждого массива, который я использовал до сих пор, были отдельные входы для каждого индекса, как бы я мог преобразовать 1 переменную в массив символов? Просто с 'mid (String, x, y)'? – Yorrick

+0

Помогите мне понять. Я думал, что '1011001101' была строкой, которая представляла собой включение каждого отдельного флажка. Разве это не так? –

+0

Ключ 'xxxxxxxxxx' просто имеет каждую цифру, представляющую разрешенную функцию для пользователя, если это' 1111111111' (например), что означает, что у пользователя есть все возможные функции, и, таким образом, все флажки будут отмечены, когда 'OnSelectedIndexChanged' увольняется. Проще говоря, каждая цифра представляет собой, или флажок должен быть проверен или нет. – Yorrick

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)) 
+0

Я тоже думал о чем-то подобном, но я использую этот ключ разрешения в двух разных формах allready, и слишком много кода зависит от него. Уже для меня 2 просто отпустите его, хотя вы идея, вероятно, лучше, мне действительно не хочется переделывать, как 40% моего текущего кода. – Yorrick

+0

Это должно быть перечисление, помеченное ['FlagAttribute'] (http://msdn.microsoft.com/en-us/library/ system.flagsattribute.aspx). – MarcinJuraszek

+0

Согласен. Это должен быть флаг перечисления – dbasnett

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 
Смежные вопросы