C # Winform рендеринг сетки медленно в Windows 7 - PullRequest
5 голосов
/ 14 сентября 2011

Я заметил, что C # winform datagrid довольно медленно работает на моей Windows 7 64-битной машине. Для стандартной сетки с 1000 строками + достаточным количеством столбцов / текста, чтобы соответствовать ширине экрана, я вижу заметную задержку рендеринга с прокруткой (то есть перемещение полосы прокрутки / полосы прокрутки отстает на ~ 0,5 секунды вместо плавного). Сетка особенно медленная, когда развернута на весь экран, и становится быстрее при уменьшении размера дисплея.

Графический интерфейс представляет собой простую настройку, связывая DataTable с экземпляром DataGridView; Я посмотрел на распространенных виновников, таких как двойная буферизация, и не увидел особых улучшений. Машина выигрывает 7 64 бит с четырьмя ядрами Xeon и 2 x 23 дюймовыми экранами на nvidia quadro nvs 420.

Кто-нибудь знает, почему это происходит?

Ответы [ 2 ]

5 голосов
/ 14 сентября 2011

Попробуйте отключить все обработчики событий для сетки, а затем посмотрите, как работает сетка.Если он работает нормально, включите его, пока не доберетесь до производительности.Если даже когда в сетке нет обработчиков событий, и она все еще работает медленно, виновником может быть автоматическое изменение размера, как упомянул Стив в своем ответе.

Влияет ли производительность приложения на какой-либо другой машине?Может ли это быть что-то, связанное с необходимостью переустановки видеодрайверов?

Редактировать: Я только что сделал тестовое приложение и увидел вашу проблему, но она ушла, когда я сделал двойную буферизацию?как вы делали двойную буферизацию?

смотрите этот ответ: Как удвоить буферизацию элементов управления .NET на форме?

мой полный код, я сделал DataSet с 20 столбцами под названием DataSet1, а затем я создал простую форму Windows с DataGridView:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // comment out the line below for the application to lag
            SetDoubleBuffered(dataGridView1);


            for (int i = 0; i < 10000; i++)
            {
                dataSet1.DataTable1.AddDataTable1Row(GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString());
            }
        }

        public static void SetDoubleBuffered(System.Windows.Forms.Control c)
        {
            //Taxes: Remote Desktop Connection and painting
            //http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx
            if (System.Windows.Forms.SystemInformation.TerminalServerSession)
                return;

            System.Reflection.PropertyInfo aProp =
                  typeof(System.Windows.Forms.Control).GetProperty(
                        "DoubleBuffered",
                        System.Reflection.BindingFlags.NonPublic |
                        System.Reflection.BindingFlags.Instance);

            aProp.SetValue(c, true, null);
        }


        private Random rand = new Random();

        private string validChars = "0123456789abcdefghijklmnopqurstuvwyz";

        private string GetRandomString()
        {
            StringBuilder builder = new StringBuilder();

            char[] c = new char[rand.Next(15,20)];
            for (int i = 0; i < c.Length; i++)
            {
                c[i] = validChars[rand.Next(0, validChars.Length - 1)];
            }

            return new string(c);
        }
    }
}

Протестировано с более чем 100 000 записей, каждая из которых содержит 20 столбцов различной длины от 15-20

1 голос
/ 14 сентября 2011

Возможно, вы захотите проверить настройки AutoSizeRowsMode и AutoSizeColumnsMode.

Иногда автоматическое изменение размера может замедлять работу графического интерфейса.

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