Oder gibt es für diesen Zweck eine besser geeignete Steuerung von Drittanbietern?
Antworten
Zu viele Anzeigen?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?
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
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;
}
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
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...
0 Stimmen
Nach etwa 100 Spalten würden sich die Daten meiner Meinung nach in "weißes Rauschen" auflösen.
1 Stimmen
Ich muss die Scheitelpunkte eines Netzes anzeigen, die Anzahl der Scheitelpunkte kann in seltenen Fällen wirklich hoch gehen.
0 Stimmen
@annakata: Es ist perfekt lesbar, wenn Sie Ihren Monitor auf die Seite drehen :-)
4 Stimmen
Wenn Sie ein Mesh anzeigen wollen, sollten Sie stattdessen eine Grafikbibliothek verwenden....Gitter sind langsam. Ich kann mir nicht vorstellen, wie schlecht ein Gitter mit 65k+ Spalten sein würde.