Как добавить более 65 535 столбцов в виде таблицы данных в приложении C # Windows?

2

Или для этой цели есть более подходящий сторонний элемент управления?

  • 13
    Вы ожидаете, что> 65 535 столбцов будут удобочитаемыми для человека?
  • 2
    Мне действительно трудно придумать причину для этого ...
Показать ещё 6 комментариев
Теги:
winforms
datagridview

5 ответов

9
Лучший ответ

Я знаю, что DevExpress XtraGrid поддерживает теоретически Int32.MaxValue строки или столбцы в сетке. В этом случае предел - это системная память, а не сетка.

Но вам действительно нужно отображать столько данных?

  • 2
    +1 за сторонний вариант и поднимающий вопрос, почему
2

Использовать виртуальный список (загружает только видимые строки). Я не уверен, что WinForms ListView имеет виртуальный режим, но WPF делает.

Создайте пользовательский элемент управления WPF и настройте его для VirtualMode = True и хоста, который будет управлять пользователем вашего клиента WinForms контейнером ElementHost.

Извините, я не могу быть более конкретным, у меня нет кода.

Райан

2

Короткий ответ: не делайте этого!

Длинный ответ: измените FillWeight на 10 или меньше (по умолчанию 100). Предел, который вы достигаете, обусловлен суммой FillWeight, превышающей 64K x 100 (кто знает, почему это предел).

  • 1
    Что ж, если вы сохраните значение по умолчанию FillWeight, то предел столбца составит около 655, потому что ColumnCount x FillWeight <65535! Таким образом, даже если вы измените значение FillWeight на минимум, равный 1, максимальное количество столбцов составит 65 535.
  • 0
    Ах, я, кажется, забыл! Спасибо
1

Вам не хватает того, что переменная FillWeight принимает число с плавающей запятой, а не целое число, поэтому 0,5 или 0,01f будут делать (последнее позволило бы до 6553500 столбцов в теории). К сожалению, создание происходит очень медленно (по крайней мере для меня, все более и более около 1000 столбцов, 10 000 колос занимает около 20 секунд). Возможно, другие, предлагаемые VirtualMode, заслуживают внимания.

Для чего это стоит, вот код, который я использую для создания таблицы размером x по y пустых ячеек. Возможно, кто-то еще может оптимизировать скорость:

private void createDGVcells(DataGridView dgv, int columns, int rows) {
    // Optimization:
    dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;  // Massive speed up if high column count
    dgv.ScrollBars = ScrollBars.None;   // Apx. 75% speedup for high row count
    dgv.AllowUserToAddRows = false; // Further 50% apx speedup when creating rows
    dgv.ReadOnly = true;            // Small apx. 50ms latency speedup?

    // First clear any existing cells, should they exist:
    if (dgv.DataSource != null) dgv.DataSource = null;
    else    {
        dgv.Rows.Clear();
        dgv.Columns.Clear();
    }

    // Create the first row (the columns):
    DataGridViewColumn[] dgvc = new DataGridViewColumn[columns];
    for (int i = 0; i < dgvc.Length; ++i)   {
        DataGridViewColumn dg = new DataGridViewTextBoxColumn();
        dg.FillWeight = 0.1f; // Allows up to 655350 columns in theory
        dgvc[i] = dg;
    }
    dgv.Columns.AddRange(dgvc);

    // Add all the rows (very quick)
    for (int j = 0; j < rows - 1; j++) dgv.Rows.Add();

    // Optional to turn these back on
    dgv.ReadOnly = false;
    dgv.AllowUserToAddRows = true;
    dgv.ScrollBars = ScrollBars.Both;
    dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
}   
0

Xceed DataGrid для WPF может сделать это легко и использует виртуализацию столбцов и UI. Проверьте свою живую демоверсию. Вы можете заполнить демо с большим количеством столбцов и строк, необходимых для тестирования перформанса. http://xceed.com/Grid_WPF_Demo.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню