2010-03-05 3 views
2

Я пишу некоторую проверку ошибок и пытаюсь использовать логический массив для хранения истинных или ложных элементов, а затем мое заключительное условие анализирует через сохраненные элементы, чтобы определить, все верно в visual studio 2008. Theres, вероятно, более простой способ выполнить проверку ошибок, но может также изучить, как использовать массив. Вот то, что я до сих порПроверка значений элементов в булевом массиве - C#

bool[] checker = new bool[1]; // declared array...I think 

private void print_button_Click(object sender, EventArgs e) 
{ 
    if (authorbox.Text == "") 
    { 
    MessageBox.Show("Author field empty", "Required Entry"); 
    } 
    else 
    { 
    checker[0] = true; // assigning element to array correctly? 
    } 

    if (titlebox.Text == "") 
    { 
    MessageBox.Show("Title field Empty", "Required Entry"); 
    } 
    else 
    { 
    checker[1] = true; 
    } 

    // The part I am having trouble with basically if any of my array elements are 
    // false don't execute printing. Else go ahead and print. 
    if() 
    { 
    } 
    else 
    { 
    printPreviewDialog1.Document = printDocument1; 
    printPreviewDialog1.ShowDialog(); 
    } 
} 
+0

'проверка [1] = TRUE;' сгенерирует отказ от Границы ошибок: ваш массив имеет только один элемент ('BOOL [1]'), который будет по индексу 0 (C индексы # массивов- -исходя из). Я думаю, вы имеете в виду 'checker' как двухэлементный массив, то есть' bool [] checker = new bool [2]; '. – itowlson

+0

Ошибка в коде. Если вы объявляете массив с 1 индексом (новый bool [1]) ... У него не может быть checker [1].Число в [] - это количество или общее количество элементов массива. Фактические значения индекса, которые будут ссылаться на них, будут тогда основаны на нулевом значении. Итак, вам нужно будет сделать bool [] checker = new bool [2]; быть в состоянии сделать checker [0] и checker [1] – NebuSoft

ответ

1

вместо того, чтобы использовать массив было бы гораздо проще просто выйти из метода, как только обнаружена ошибка:

private void print_button_Click(object sender, EventArgs e) { 
    if (authorbox.Text == "") { 
    MessageBox.Show("Author field empty", "Required Entry"); 
    return; 
    } 

    if (titlebox.Text == "") { 
    MessageBox.Show("Title field Empty", "Required Entry"); 
    return; 
    } 

    printPreviewDialog1.Document = printDocument1; 
    printPreviewDialog1.ShowDialog(); 
} 
+0

Выход сразу после обнаружения первой ошибки вызывает проблемы с удобством использования. Если оба автора и заголовок являются обязательными, и оба они отсутствуют, вы должны сообщить об этом пользователю. В противном случае пользователь исправляет одну ошибку только для того, чтобы сказать «о, но есть еще одна ошибка, о которой я вам не рассказывал». (По общему признанию, последовательность исходного кода из нескольких ящиков сообщений также имела плохую юзабилити, но, по крайней мере, она давала пользователю всю необходимую им информацию.) – itowlson

+0

, имеющий 10 всплывающих ящиков сообщений, будет довольно раздражать. может быть лучше всего просто переключиться на использование поставщиков ошибок (и отключить кнопку по требованию) или по крайней мере собрать сообщения об ошибках в списке и отобразить их в одном ящике сообщений ... во всяком случае, я бы не использовал массивы bool в любом решении , – stmax

+0

возвращение закончило работать красиво. – Matt

1

Ну это не идеальный способ для обработки ошибок, но вы можете использовать .Contains() метод.

if (checker.Contains(false)) 
{ 
    // Do Something 
} 
else 
{ 
    printPreviewDialog1.Document = printDocument1; 
    printPreviewDialog1.ShowDialog(); 
} 
1

Помимо всего прочего, вы должны сказать

bool[] checker = new bool[2]; 

если вы хотите массив, состоящий из 2-х элементов;) В данном случае массив, кажется, не делать слишком много смысла, потому что это немного запутывает вещи. Вы можете сделать то же самое только с одной логической переменной.

+0

Ha, совершенно верно. Я сам этого не заметил. –

0

Я уверен, что метод Contains, предложенный NebuSoft, является расширением LINQ и поэтому недоступен в .NET 2.0. Однако вы можете использовать метод Array.IndexOf<T>, как это:

if (Array.IndexOf<bool>(checker, false) != -1) 
{ 
    // some element in the array is false 
} 
else 
{ 
    // no false in the array 
} 

Однако NebuSoft прав, утверждая, что это не самый лучший подход. Если вам интересно узнать больше, я буду рад обсудить его дальше.

+0

Совершенно верно. Я склонен делать предположение о 3.5 при использовании VS 2008, но это не всегда так. :) – NebuSoft

+0

Список . Контейнеры не связаны с LINQ и доступны в версии 2.0 выше .NET framework. – RoadWarrior

+0

Но bool []. Содержит LINQ-related. – RoadWarrior

4

Если вы используете .NET 3.5 вы можете использовать любой и все, чтобы увидеть, если какая-либо из булевых истинно, или если все они являются истинными:

if (checker.Any(x => x)) 

или:

if (checker.All(x => x)) 

Кроме того, если вам нужен массив из двух логических элементов, вы должны использовать new bool[2] не new bool[1]. Было бы проще использовать List<bool>.

+0

Если .NET 3.5 доступен, это будет мое предпочтительное средство, хотя бы для того, чтобы быть максимально кратким. –

+1

Я понимаю, что эффективно/логически это выполнит то же самое, что и «Содержит (x)», но для меня это похоже круговое движение. По сути, эти методы будут перечислять через 'checker' и оценивать' if ((checker [i] == true) == true) '... –

1

Использование логических массивов аккумулировать один идти/не годен значение не является излишеством. Есть более полезные вещи, с которыми вы могли бы играть, чтобы получить массив массивов.

Ты лучше просто результаты операции AND ваших промежуточных проверок в значение, а затем проверить, что для истинно/ложно:

public bool CheckControls() 
{ 
    bool pass = true; 
    pass &= !string.IsNullOrEmpty(authorbox.Text)); 
    pass &= !string.IsNullOrEmpty(titlebox.Text)); 
    // if any of these are empty then pass is to false and stays that way. 
    return pass; 
} 

Если вам необходимо отслеживать, какие промежуточный тест не пройден, а затем рассмотреть используя целочисленные и предопределенные константы степеней двух. Здесь вы вместо этого проверяете нуль, если все хорошо. Это позволяет вам маскировать возвращаемое значение и накапливать любую комбинацию результатов теста. Если у вас менее 32 (или 64) тестов.

int AUTHORBOX = 2; 
    int TITLEBOX = 4; 
    int ISBNBOX = 8; 
    int PRICEBOX = 16; 

    public int AlternateCheck() 
    { 
     int temp = 0; 
     temp += string.IsNullOrEmpty(authorbox.Text) ? AUTHORBOX : 0; 
     temp += string.IsNullOrEmpty(titlebox.Text) ? TITLEBOX : 0; 
     temp += string.IsNullOrEmpty(isbnbox.Text) ? ISBNBOX : 0; 
     temp += string.IsNullOrEmpty(pricebox.Text) ? PRICEBOX : 0; 
     return temp; 
    } 
Смежные вопросы