Цвет фона C# WinForms DataGridView, представляющий слишком медленный

Для моего механизма OpenGL следующий надрез преобразует мышь/координаты экрана в 3D мировые координаты. Прочитайте комментарии для фактического описания того, что продолжается.

/*   FUNCTION:        YCamera :: CalculateWorldCoordinates
     ARGUMENTS:       x         mouse x coordinate
                      y         mouse y coordinate
                      vec       where to store coordinates
     RETURN:          n/a
     DESCRIPTION:     Convert mouse coordinates into world coordinates
*/

void YCamera :: CalculateWorldCoordinates(float x, float y, YVector3 *vec) { // START GLint viewport[4]; GLdouble mvmatrix[16], projmatrix[16];

GLint real_y;
GLdouble mx, my, mz;

glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projmatrix);

real_y = viewport[3] - (GLint) y - 1;   // viewport[3] is height of window in pixels
gluUnProject((GLdouble) x, (GLdouble) real_y, 1.0, mvmatrix, projmatrix, viewport, &mx, &my, &mz);

/*  'mouse' is the point where mouse projection reaches FAR_PLANE.
    World coordinates is intersection of line(camera->mouse) with plane(z=0) (see LaMothe 306)

    Equation of line in 3D:
        (x-x0)/a = (y-y0)/b = (z-z0)/c      

    Intersection of line with plane:
        z = 0
        x-x0 = a(z-z0)/c  <=> x = x0+a(0-z0)/c  <=> x = x0 -a*z0/c
        y = y0 - b*z0/c

*/
double lx = fPosition.x - mx;
double ly = fPosition.y - my;
double lz = fPosition.z - mz;
double sum = lx*lx + ly*ly + lz*lz;
double normal = sqrt(sum);
double z0_c = fPosition.z / (lz/normal);

vec->x = (float) (fPosition.x - (lx/normal)*z0_c);
vec->y = (float) (fPosition.y - (ly/normal)*z0_c);
vec->z = 0.0f;

}

9
задан stuartd 27 October 2009 в 11:26
поделиться

3 ответа

Вместо изменения цвета всего DataGrid сразу, вы должны позволить ему управлять рендерингом, переопределив событие CellFormatting . Строки будут раскрашены только тогда, когда они действительно отображаются на экране.

private void aufgabenDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
  DataGridViewRow row = aufgabenDataGridView.Rows[e.RowIndex];
  AufgabeStatus status = (AufgabeStatus) Enum.Parse(typeof(AufgabeStatus), (string) row.Cells["StatusColumn"].Value);

  switch (status)
  {
    case (AufgabeStatus.NotStarted):
      e.CellStyle.BackColor = Color.LightCyan;
      break;
    case (AufgabeStatus.InProgress):
      e.CellStyle.BackColor = Color.LemonChiffon;
      break;
    case (AufgabeStatus.Completed):
      e.CellStyle.BackColor = Color.PaleGreen;
      break;
    case (AufgabeStatus.Deferred):
      e.CellStyle.BackColor = Color.LightPink;
      break;
    default:
      e.CellStyle.BackColor = Color.White;
      break;
  }

}

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

...
DataGridViewRow row = aufgabenDataGridView.Rows[e.RowIndex];
var aufgabe = (Aufgabe) row.DataBoundItem;
AufgabeStatus status = aufgabe.Status;
...
13
ответ дан 4 December 2019 в 11:06
поделиться

Вероятно, это вызов Enum.Parse, у него низкая производительность. Вам следует попробовать изменить его на поиск по словарю, чтобы увидеть, улучшает ли это производительность. См. Этот пост

2
ответ дан 4 December 2019 в 11:06
поделиться

Как сказал SwDevMan1, вы должны сначала поработать над удалением вызова Enum.Parse. Используете ли вы привязку данных для заполнения сетки? Если это так, вы можете использовать Rows [index] .DataBoundItem для доступа к объекту с привязкой к данным для строки и прямого доступа к статусу AufgabeStatus.

Вторая настройка, которую я бы предложил, - это вызов SuspendLayout () и ResumeLayout () до и после соответственно, манипулируя сеткой.

2
ответ дан 4 December 2019 в 11:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: