2016-05-10 14 views
1

Сложите:DataGridView "удалить пустые строки" - кнопка

  • для Windows 10

  • Visual Studio 2015

  • C#, Win Forms

  • DataGridView

-> пытается удалить пустые строки на кнопку мыши событии

(я понятия не имею, где проблема вызвана, поэтому я щедро добавленный код из других кнопок)


Я использую некоторые кнопки, чтобы добавить строку (s):

private void someButton_Click(object sender, EventArgs e) 
{ 
    dataGridView1.Rows.Add(1); 
    dataGridView1.Select(); 
    dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0]; 
} 

И еще одна кнопка, чтобы удалить последнюю строку DataGridView:

private void anotherButton_Click(object sender, EventArgs e) 
{ 
    if (dataGridView1.Rows.Count > 0) 
    { 
     dataGridView1.Rows.Remove(dataGridView1.Rows[dataGridView1.Rows.Count - 1]); 
    } 
} 

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

private void thirdButton_Click(object sender, EventArgs e) 
{ 
    foreach (DataGridViewRow row in dataGridView1.Rows) 
    { 
     if (row.Cells[0].Value == null) 
     { 
      dataGridView1.Rows.RemoveAt(row.Index); 
     } 
    } 
} 


Когда я нажимаю «thirdButton» некоторые пустые строки удалены, но как ни странно не все из них. Я немного поиграл и заметил, что я должен был нажимать кнопку несколько раз, чтобы стереть все пустые строки. В DataGridView действует как следующее:

4 пустые строки существуют + нажатие кнопки
-> 2 пустые строки слева

2 пустые строки + нажатие кнопки
-> 1 пустая строка влево

1 последняя пустая строка кнопка + пресс
-> 0 пустые строки (яй)

(То же самое с, например, 11 -> 5 -> 2 -> 1 -> 0)

Так кажется, что моя кнопка сокращает вдвое количество пустых строк, и я хотел бы знать, почему! Любые идеи?

ответ

3

Вы не можете изменить коллекцию, как в случае с ForEach. Попробуйте выполнить повторную проверку коллекции, которая сохраняет индексный порядок:

for (int i = dataGridView1.Rows.Count; i > -1; --i) { 
    DataGridViewRow row = dataGridView1.Rows[i]; 
    if (!row.IsNewRow && row.Cells[0].Value == null) { 
    dataGridView1.Rows.RemoveAt(i); 
    } 
} 
+0

Есть ли причина, по которой "foreach" здесь не работает? – Avigrail

+2

Я думаю, что вы имели в виду: for (int i = dataGridView1.Rows.Count - 1; i> -1; i--) –

+0

@RudyTheHunter отлично! Теперь это работает. Спасибо вам обоим. Тем не менее, я хотел бы знать причину (если есть: p) – Avigrail

1

Есть две вещи, которые пришли мне на ум. Первый из них:

  1. Вы должны проверить наличие пустых и "". Чтобы упростить это, просто проверьте, равна ли длина строки 0. Иногда пользователь может оставить пробелы, которые не будут обнаружены как null или length == 0, поэтому попробуйте удалить пробелы в каждой записи программно до проверки
  2. Вторая проблема может быть указателем. Когда вы удаляете строки, индекс поднимается и оставляет одну строку позади. Одним из решений является удаление строк с конца.
+0

Итак, «foreach» обновляет пустую коллекцию строк в цикле? – Avigrail

Смежные вопросы