Matrixberichte sind ein ausgezeichnetes Werkzeug für die Datenanalyse. Im Grunde ist eine Matrix in Analyseberichten eine Pivottable. Um die Analyse zu erleichtern, wird häufig «bedingte Hervorhebung» verwendet. Es ist ein ständiges Werkzeug in FastReport.Net. Bedingte Hervorhebung bedeutet, dass die Datenzellen in Farbe, Schriftart oder Symbolen hervorgehoben werden, abhängig von einer bestimmten Bedingung. Aber die bedingte Hervorhebung funktioniert mit einzelnen Zellen. Aber was müssen wir machen, wenn wir die gesamten Spalten abhängig vom Wert in der Kopfzeile hervorheben möchten? Zum Beispiel, um die Wochenenden hervorzuheben, müssen wir auf das «allmächtige» Berichtsskript zurückgreifen. Die normalen Farbauswahlwerkzeuge werden hier nicht helfen.
Erstellen wir eine Matrixvorlage basierend auf der MatrixDemo-Tabelle aus der Demo-Datenbank nwind.xml:
Die Idee ist, Spalten mit Werten in den Kopfzeilen zu finden, die die Bedingung erfüllen. In dieser Matrix zeigen wir das Einkommen der Mitarbeiter nach Jahren an.
Lassen Sie uns die Spalten mit den Überschriften 2012 und 2014 hervorheben. Um dies zu tun, müssen wir den Titel in dieser Spalte und alle nachfolgenden Zellen, einschließlich der Summe, mit einer Farbe markieren. Erstellen wir ein BeforePrint-Ereignis für die Matrix:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Liste der markierten Spalten private List<int> markedColumns; // Zähler für die Spalten in der ersten Zeile private int firstLineColumn; // Zähler für die Spalten in den folgenden Zeilen private int secondLineColumn; // Matrix-Ereignishandler private void Matrix2_BeforePrint(object sender, EventArgs e) { // Neue Liste für markierte Spalten erstellen markedColumns = new List<int>(); // Zähler der ersten Zeile zurücksetzen firstLineColumn = 0; // Zähler für nachfolgende Zeilen zurücksetzen secondLineColumn = 0; } |
Am Anfang haben wir einige Variablen, die wir in den Ereignishandlern verwenden werden, hinzugefügt. Diese Variablen speichern markierte Spalten für Zeilen. Als nächstes initialisieren wir die Variablen, bevor die Matrix angezeigt wird.
Erstellen wir einen weiteren BeforePrint-Ereignishandler für die Zelle mit dem Wert [Year]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Ereignishandler für Zellen in der ersten Zeile der Matrix private void Cell18_BeforePrint(object sender, EventArgs e) { // sender als TableCell benutzen TableCell cell = sender as TableCell; // Überprüfung den erforderlichen Wert in einer Zelle if (cell.Text == "2012" || cell.Text == "2014") { // die Füllfarbe für diese Zelle festlegen cell.FillColor = Color.Brown; // in der Liste der markierten Spalten speichern markedColumns.Add(firstLineColumn); } // den Spaltenzähler für die erste Zeile erhöhen firstLineColumn++; } |
Hier müssen Sie eine kleine Notiz machen, um die Essenz zu verstehen. Tatsache ist, dass die Ausgabe der Matrix beim Erstellen eines Berichts in FastReport Zeile für Zeile erfolgt. Deshalb speichern wir die Spaltennummern für die erste Zeile der Matrix. In unserem Fall werden 2 Werte in die Liste der markierten Spalten aufgenommen.
Fügen Sie nun einen Ereignishandler für die Zelle mit dem Wert [Revenue] hinzu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Ereignishandler für Zellen in den folgenden Zeilen der Matrix. Sie müssen ihn für die zweite Zeile und die Summen festlegen. private void Cell21_BeforePrint(object sender, EventArgs e) { // sender als TableCell benutzen TableCell cell = sender as TableCell; // den aktuellen Index in der markedColumns-Liste finden if (markedColumns.IndexOf(secondLineColumn) != -1) { // die Füllfarbe für diese Zelle festlegen cell.FillColor = Color.Red; } // den Zähler erhöhen secondLineColumn++; // Zähler für die nächste Zeile zurücksetzen if (secondLineColumn >= firstLineColumn) secondLineColumn = 0; |
In diesem Handler finden wir die Spalten, die den ausgewählten Spalten aus der ersten Zeile entsprechen, und färben die Zellen in ihnen rot. Wenn die letzte Spalte erreicht ist, setzen wir die Variable für die nächste Zeile auf Null. Wie Sie wissen, ist die zweite Zeile der Matrix beim Erstellen des Berichts dynamisch. Dies bedeutet, dass es für jede Datenzeile in der Quelle ausgegeben wird. Also müssen wir jede Zeile überprüfen und die Zellen in den richtigen Spalten färben.
Die im Skript angegebene Lösung ist ungewöhnlich, aber es ist die einzige mögliche Lösung für diese Situation, da die Matrix dynamisch erstellt wird und die endgültige Struktur, die Koordinaten und die Position der Zellen nicht speichert, bevor sie direkt auf dem Arbeitsblatt gezeichnet wird. Nur das Muster (das wir im Designer gesehen haben) und die Textwerte der Matrixheader werden im Speicher gespeichert.
Daher müssen wir alle Zeilen durchlaufen und die Spalten zum Färben merken.
Basierend auf dem Skript, mussten wir drei BeforePrint-Ereignishandler für die Matrix, die Zelle [Year] und die Zelle [Revenue] erstellen. Aber es gibt eine andere dritte Zeile in unserer Matrix. Es zeigt die Ergebnisse an, und es wäre gut, sie auch entsprechend den ausgewählten Spalten zu färben. Um dies zu tun, anschließen Sie für die Zelle unter [Revenue] einfach den BeforeFrint-Ereignishandler von derselben Zelle [Revenue]:
Und jetzt starten wir den Bericht:
Wenn Sie die Ergebnisse in einer anderen Farbe färben möchten, müssen Sie einen eigenen BeforePrint-Ereignishandler für die Ergebniszelle erstellen, der dem Ereignishandler [Revenue] ähnelt.