Цикл C# Foreach — продолжить выпуск

У меня проблема с оператором continue в цикле C# Foreach.

Я хочу, чтобы он проверял, есть ли пустая ячейка в datagridview, и если да, то пропустите печать значения и перейдите к проверке следующей ячейки.

Помощь очень ценится.

Вот код:

foreach (DataGridViewRow row in this.dataGridView1.Rows)
{                            
    foreach (DataGridViewCell cell in row.Cells)
    {
        if (cell.Size.IsEmpty)
        {
            continue;
        }
        MessageBox.Show(cell.Value.ToString());
    }
}

person Goober    schedule 02.05.2009    source источник
comment
вы забыли упомянуть о проблеме, которую вы видите...   -  person Mitch Wheat    schedule 02.05.2009


Ответы (4)


Сейчас вы проверяете, равен ли размер ячейки нулю. В сетке каждая ячейка в столбце имеет одинаковую ширину, а каждая ячейка в строке — одинаковую высоту (во всяком случае, как правило).

Вы хотите проверять на основе значения ячейки. Например:

if (cell.Value == null || cell.Value.Equals(""))
{
    continue;
}

Настройте это для любых других представлений «пустых» значений, которые вас интересуют. Если их много, вы можете написать для этого специальный метод и вызывать его при проверке:

if (IsEmptyValue(cell.Value))
{
    continue;
}
person Jon Skeet    schedule 02.05.2009
comment
Разве мы, программисты на C#, обычно не избегаем операторов continue/goto? Я понимаю, что у них есть свое место в некоторых языках, и их можно использовать, чтобы уйти от некоторых неприятных вещей... но лично мне никогда не приходилось использовать оператор continue для чего-то вроде приведенных выше примеров. - person Ralph Caraveo; 02.05.2009
comment
Нет, я считаю, что continue и break подходят, хотя я никогда не использовал goto. В частности, я бы не хотел просто инвертировать условие и поместить все в другой блок - вложенность становится сумасшедшей по сравнению с простотой, я не хочу делать что-либо еще в этой итерации, если это условие выполняется. - person Jon Skeet; 02.05.2009

Вам не нужно использовать здесь ключевое слово continue, вы можете просто сделать это:

foreach (DataGridViewRow row in this.dataGridView1.Rows)
{                            
    foreach (DataGridViewCell cell in row.Cells)
    {
        if (!cell.Size.IsEmpty) MessageBox.Show(cell.Value.ToString()); // note the ! operator
    }
}

Кроме того, вы проверяете, не пуст ли размер ячейки. Это действительно то, что вы хотите сделать?

Какие ошибки вы получаете?

person Rik    schedule 02.05.2009

Разве вы не должны проверять, пусто ли значение ячейки, а не размер?

if(String.IsNullOrEmpty(cell.Value.ToString()))
    continue;
person Pat    schedule 02.05.2009

я хочу читать только данные ячейки [1] ... только

foreach (DataGridViewRow row in this.dataGridView1.Rows)
{                            
    foreach (DataGridViewCell cell in row.Cells[1])
    {
       if (cell[1].Value == null || cell.Value.Equals(""))
{
    continue;
}

        MessageBox.Show(cell[1].Value.ToString());
    }
}
person harish    schedule 21.04.2010