2015-05-15 5 views
0

У меня есть список переменных в ASP.NET (C#), который я пытаюсь выполнить без записи десятков операторов If. То, что я надеялся сделать, просто ссылается на каждую из них с переменной и добавляет ее к имени переменной. Так что-то вроде следующего:Переключить переменную в имени переменной

string _id1 = Id1CheckBox.Checke.ToString(); 
string _id2 = Id2CheckBox.Checke.ToString(); 
string _id3 = Id3CheckBox.Checke.ToString(); 

int x = 1; 

while (x < 20) 
{ 
    if ("_id&" + x == "True") 
    { 
     _id + x = x.ToString(); 
    } 
    else 
    { 
     _id + x = 0; 
    } 
    x++; 
} 

Логика, что я пытаюсь сделать, у меня есть несколько флажков на форме, Id1CheckBox, Id2CheckBox, Id3CheckBox и т.д. Мне нужно получить эти значения как строки, так что я могу передать их в качестве параметров в SQL-запросе. Таким образом, в принципе, если Id1CheckBox = true, то _id1 = 1. Если Id2CheckBox = true, то _id2 = 2. Если какие-то ложные, тогда я хотел бы получить что-то вроде If Id3CheckBox = false then _id3 = 0. Возможно ли это или мне просто нужно написать несколько Если утверждения вместо использования цикла?

ответ

0

Вы можете поставить галочки в массив, как это:

private bool[] _checked; 

public Form1() // Constructor 
{ 
    InitializeComponent(); 
    _checked = Controls 
     .OfType<CheckBox>() 
     .Where(cb => cb.Name.StartsWith("Id")) 
     .OrderBy(cb => cb.Name) 
     .Select(cb => cb.Checked) 
     .ToArray(); 
} 

Затем петлевой массив так:

for (int i = 0; i < _checked.Length; i++) { 
    if (_checked[i]) { 
     ... 
    } else { 
     ... 
    } 
} 

Примечание: Массив представляет собой список пронумерованных переменных (так сказать). Мы говорим, что массив проиндексирован. Диапазон индексов изменяется от 0 до длины массива. 1.

Если у вас есть 20 флажков, добавьте ведущие нули в имена до номера 9. Например. "Id05CheckBox". В противном случае флажки не будут отсортированы правильно.

Обратите внимание, что коллекция Controls формы содержит только элементы управления, которые находятся непосредственно на форме. Если ckeckboxes находятся на панели или вкладке или подобном, затем проведите через коллекцию этого контейнера Controls: panel1.Controls или page1.Controls - вы его получите.

+0

@Oliver Я на самом деле называю это все из отдельного класса, так что я не проходя над CheckBoxes, как флажки этого другого классом, я только передавая значение истины или лжи как строка для класса. – aantiix

+0

@ doby48: Я изменил свой ответ соответственно. Сохранение флажков в массиве имеет то преимущество, что вы можете обращаться к ним повторно, и они всегда будут показывать свое текущее состояние, поскольку массив содержит только ссылки на них. Поэтому было бы неплохо сохранить массив checkbox и получить из него массив bool, если это необходимо: 'bool [] checked = _checkBoxes.Select (cb => cb.Checked) .ToArray();'. –

0

вы можете использовать цикл и сделать что-то вроде этого внутри вашей петли

CheckBox checkbox = (CheckBox)this.FindControl("_id" + x.toString()); 

if(checkbox.isChecked) 
    //do something here 

Тогда вы можете просто прочитать значение там.

Ответ пришел из here

0

В итоге я перешел к Словарьу и добавил параметры в цикл foreach вместо того, чтобы пытаться объединить переменные. Heres код:

Dictionary<string, string> dictionary = new Dictionary<string, string>(); 

dictionary.Add("ID1", _id1); 
dictionary.Add("ID2", _id2); 
dictionary.Add("ID3", _id3); 
dictionary.Add("ID4", _id4); 

int i = 1; 

foreach (var pair in dictionary) 
{ 
    if (pair.Value == "True") 
    { 
     cmd.Parameters.AddWithValue(pair.Key, i.ToString()); 
    } 
    else 
    { 
     cmd.Parameters.AddWithValue(pair.Key, "0"); 
    } 
    i++; 
} 
Смежные вопросы