3 Stimmen

Wie kann man mehr als 65.535 Spalten in einer Datengitteransicht in einer C#-Windows-Anwendung hinzufügen?

Oder gibt es für diesen Zweck eine besser geeignete Steuerung von Drittanbietern?

13 Stimmen

Sie erwarten, dass >65.535 Spalten für den Menschen lesbar sind?

2 Stimmen

Es fällt mir wirklich schwer, einen triftigen Grund dafür zu finden...

7 Stimmen

Ich würde eher einen Blick auf das Design der Anwendung werfen, als nach einer Datengitteransicht zu suchen, die das unterstützt...

9voto

Francis B. Punkte 6776

Sé que DevExpress XtraGrid unterstützt theoretisch Int32.MaxValue Zeilen oder Spalten im Raster. In diesem Fall ist die Grenze der Systemspeicher und nicht das Raster.

Aber müssen Sie wirklich so viele Daten anzeigen?

2voto

leppie Punkte 111830

Kurze Antwort: Tun Sie es nicht!

Lange Antwort: Ändern Sie die FillWeight auf 10 oder weniger (Standard ist 100). Die Grenze, die Sie erreichen, ist darauf zurückzuführen, dass die gesamte FillWeight 64K x 100 überschreitet (wer weiß, warum das eine Grenze ist).

2voto

Ryan O'Neill Punkte 5250

Verwenden Sie eine virtuelle Liste (lädt nur die Zeilen, die sichtbar sind). Ich bin nicht sicher, dass WinForms ListView einen virtuellen Modus hat, aber die WPF ein tut.

Erstellen Sie also ein WPF-Benutzersteuerelement und richten Sie es für VirtualMode = True ein und hosten Sie dieses Benutzersteuerelement auf Ihrem WinForms-Client mit einem ElementHost-Container.

Tut mir leid, dass ich keine genaueren Angaben machen kann, ich habe den Code nicht zur Hand.

Ryan

1voto

Dan W Punkte 3262

Sie übersehen, dass die FillWeight-Variable eine Fließkommazahl und keine Ganzzahl annimmt, so dass 0,5f oder 0,01f ausreichen würden (letzteres würde theoretisch bis zu 6553500 Spalten ermöglichen). Leider ist die Erstellung sehr langsam (zumindest bei mir, zunehmend nach etwa 1000 Spalten; 10.000 Spalten dauern etwa 20 Sekunden). Vielleicht ist der VirtualMode, den andere vorgeschlagen haben, einen Versuch wert.

Im Folgenden finden Sie den Code, mit dem ich eine Tabelle mit leeren Zellen der Größe x x y erstelle. Vielleicht kann jemand die Geschwindigkeit weiter optimieren:

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;
}

0voto

Das DataGrid für WPF von Xceed kann dies einfach tun und verwendet sowohl Spalten- als auch UI-Virtualisierung. Sehen Sie sich die Live-Demo an. Sie können die Demo mit so vielen Spalten und Zeilen auffüllen, wie Sie zum Testen der Leistung benötigen. http://xceed.com/Grid_WPF_Demo.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X