Очистка DataGridView или удаление всех записей

Сейчас разрабатываю приложение, которое работает с базой данных и производит вывод информации в элемент DataGridView. И на одном из этапов разработки мне понадобилось очистить весь DataGridView. Вроде бы элементарная задача, однако решить её первым возникшим у меня в голове способом мне не удалось.

Начнем с того, что метод Clear() не работает.


dataGridView2.Rows.Clear();

Тогда на помощь приходит цикл:


int rowsCount = dataGridView2.Rows.Count;
for (int i = 0; i < rowsCount; i++) {
    dataGridView2.Rows.Remove(dataGridView2.Rows[0]);
}

Либо


while (dataGridView2.Rows.Count !== 0) {
    dataGridView2.Rows.Remove(dataGridView2.Rows[dataGridView2.Rows.Count - 1]);
}

Производим удаление последней записи до тех пор, пока количество записей не будет равно нулю.

Как подсказали в комментариях, происходило это потому, что вероятно был биндинг с DataSource.
В таком случае стоит попробовать следующий вариант:


dataGridView2.DataSource = new object();

Но сейчас я бы предпочел получить BindingSource и очистить его.


dataGridView2.DataSource.Clear();

Вот так нужно очищать DataGridView, если метод Clear() не срабатывает. Вот такой своеобразный клининг получился.

Stas Kuryan

Web developer. Перфекционист в написании кода.

10 комментариев

  1. Вадим     

    Так наверное проще будет)
    [csharp]dataGridView2.Rows.Clear[/csharp]

    • Stafox        Автор

      Согласен. Только в моём случае метод Clear() не сработал.

      • Andriy     

        [csharp]dataGridView1.Rows.Count = 0;[/csharp]

        • nee     

          dataGridView1.Rows.Count = 0

          Сount — только на чтение

      • Suvitruf     

        На DataGrid прицеплен DataSource?

        • Anonimus     

          А если данные через DataSource, тогда .Rows.Clear() не поможет.
          Тут нужно сделать вакуум в DataSource:
          dataGridView1.DataSource = new object();

  2. Виктор     

    Не делал отладку, я вижу?

    for (int i = 0; i < dataGridView2.Rows.Count; i++)

    При каждом входе в цикл проверяется Count. Раз вы удаляете одну строку в каждом шаге цикла, то Count будет каждый раз уменьшаться. У вас i завязан на текущее кол-во строк. Поэтому и удаляется только половина.
    1) i=0; Count=4;
    2) i=1; Count=3;
    3) i=2; Count=2;//И тут вы неожиданно выходите из цикла, потому что отладкой пользоваться не умеете.
    Если бы вы сначала запомнили где-то Count, а потом сравнивали i с запомненным, то все было бы норм.

    • Stafox        Автор

      Да. Все верно. Проблема с этим. Вы просто молодец, что заметили проблему в статье 2011 года моих университетских времен 🙂
      Основной посыл статьи в том, что метод clear ничерта не работал:)

  3. Евгений     

    DataTable dt = new DataTable();
    dataGridView1.DataSource = dt;

    profit

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *