Или для этой цели есть более подходящий сторонний элемент управления?
Я знаю, что DevExpress XtraGrid поддерживает теоретически Int32.MaxValue строки или столбцы в сетке. В этом случае предел - это системная память, а не сетка.
Но вам действительно нужно отображать столько данных?
Использовать виртуальный список (загружает только видимые строки). Я не уверен, что WinForms ListView имеет виртуальный режим, но WPF делает.
Создайте пользовательский элемент управления WPF и настройте его для VirtualMode = True и хоста, который будет управлять пользователем вашего клиента WinForms контейнером ElementHost.
Извините, я не могу быть более конкретным, у меня нет кода.
Райан
Короткий ответ: не делайте этого!
Длинный ответ: измените FillWeight на 10 или меньше (по умолчанию 100). Предел, который вы достигаете, обусловлен суммой FillWeight, превышающей 64K x 100 (кто знает, почему это предел).
Вам не хватает того, что переменная 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;
}
Xceed DataGrid для WPF может сделать это легко и использует виртуализацию столбцов и UI. Проверьте свою живую демоверсию. Вы можете заполнить демо с большим количеством столбцов и строк, необходимых для тестирования перформанса. http://xceed.com/Grid_WPF_Demo.html