Как выйти из цикла при достижении последней строки в datagridview, используя событие DataGridRowPostPaint - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть элементы в сетке данных с использованием приложения Windows C #, и я создал событие DataGrid_RowPostPaint для генерации серийного номера для каждой строки в сетке данных.

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

Это код:

private void TestsDataGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    this.TestsDataGrid.Rows[e.RowIndex].Cells["Serial"].Value = (e.RowIndex + 1).ToString();
}

Как обновить код в событии, чтобы выйти из события и завершить цикл при достижении последней строки в представлении данных.

Ответы [ 2 ]

1 голос
/ 01 октября 2019

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

Событие RowPostPaint вызывается после окрашивания строки. Если вы измените значение ячейки, оно будет снова вызываться , чтобы отобразить новое значение!

Переместите этот код в другое событие, возможно, CellValueChanged! Вот пример, который устанавливает значение 2-й ячейки в текущую секунду после того, как ячейка в 1-м столбце была изменена в 1-й раз:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    int col1 = 0;
    int col2 = 1;

    if (e.ColumnIndex == col1  && dataGridView1[col1  , e.RowIndex] == null)
        dataGridView1[col2 , e.RowIndex].Value = DateTime.Now.Second + "s";
}

Адаптируйтесь к вашим условиям и т. Д.!

Подводя итог: вы используете неправильное событие для изменения значений ячеек! - Не изменять значения ячеек в событии Paint !!

0 голосов
/ 30 сентября 2019

Событие рисования часто вызывается главным обработчиком событий системного менеджера приложений Windows.

Это делается каждый раз, когда элемент управления обновляет свое содержимое.

Это делается, например, при перемещении или изменении размера формы, перемещении мыши над элементом управления, перемещении сверху вниз по z-порядку ...

Вот почему это кажетсяпетля.

Вы можете определить условие для случая, когда вы не хотите рисовать, используя такой флаг в начале метода:

private void TestsDataGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
  if ( !paintRequired ) return;
  this.TestsDataGrid.Rows[e.RowIndex].Cells["Serial"].Value = (e.RowIndex + 1).ToString();
}

В загрузке формы:

paintRequired = true;

Где-то в вашем коде после загрузки данных из базы данных напишите:

paintRequired = true;
TestsDataGrid.Refresh();
paintRequired = false;

Делайте это каждый раз, когда данные меняются.

Но вы должны использовать вычисляемый столбец:

Создание столбцов выражений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...