Monthly Archives: Januar 2013

Typo3: Ältere Version einer Extension installieren

Wenn man eine ältere Version einer Extension installieren muss, dann geht man im Extensionmanager (links unter Adminwerkzeuge–>Erweiterungen) auf „Import Extension“ (Erweiterung importieren). Dort sucht man zunächst über das Suchfeld die Extension.

Wenn man jetzt nicht auf das erste Symbol mit dem orangenen Pfeil klickt, sondern auf den Titel der Extension, dann kommt man zu einem Dialog, der die Version auswählen lässt.

Hier ein englischer Artikel, der mir dabei geholfen hat:
http://sankartypo3.wordpress.com/2012/05/19/how-to-get-the-old-version-of-a-typo3-extension/

Cheers,
Ralf

XTC: Nervige Abfrage entfernen

Es gibt im Backend an vielen Stellen unnötigerweise eine Sicherheitsabfrage „Änderungen speichern?“. Dazu muss man im „admin“-Ordner einfach nach „return confirm“ suchen. Dort findet man solche Vorkommnisse:

onClick="return confirm('<?php echo SAVE_ENTRY; ?>')"

Nach der Änderung sieht es so dann aus:

onClick=""

Das sollte man natürlich nicht überall machen. Manchmal sind solche Fallnetze auch nicht schlecht :-) Beim Anlegen von Kategorien (new_category.php) ist es jedenfalls unnötig nervig.

Cheers,
Ralf

Typo3: Große Bilder im Content einfügen

Gestern kam das Problem auf, dass eine Begrenzung im Rich-Text-Editor (RTE) von Typo3 das Einfügen größerer Bilder verweigerte. Diese Funktion ist durchaus sinnvoll, wenn man verhindern möchte, dass ein Redakteur das Layout zerschießt. In unserem Fall aber störend, wenn man weiß was man tut. Im Einfüge-Dialog steht unten:

Im „Normal“-Modus können nur Web-Grafikformate (JPG, GIF und PNG) bis zu einer Auflösung von 300×680 Pixeln verwendet werden. Dieser Modus ist zur Verwendung bereits für das Web optimierter Grafiken vorgesehen.

Um die Begrenzung aufzubohren, sollte man nach dieser Anleitung vorgehen:
http://blog.exites.de/2011/09/bildgrose-fur-eingefugte-bilder-uber-den-typo3-rte-htmlarea/ 

Wenn es nicht greift (was bei uns leider der Fall war), gibt es immer noch die Möglichkeit die „typical“-Einstellungen des RTE-Plugins zu verändern.

Dafür muss man in der Datei:

/typo3/sysext/rtehtmlarea/res/typical/pageTSConfig.txt

einfach in Zeile 231 (vor der Zeile mit der geschweiften Klammer) etwas hinzufügen. Original Block:

	buttons.bold.hotKey = b
	buttons.italic.hotKey = i
}

Nach der Änderung:

	buttons.italic.hotKey = i

	buttons.image.options.magic.maxWidth = 1000
	buttons.image.options.plain.maxWidth = 1000
}

Man könnte aber auch weniger faul sein und herausfinden, warum der Artikel bei einem nicht funktioniert :-)

Cheers,
Ralf

Windows Forms: Mehrzeilige Felder mit DataGridView

In einem DataGridView kann man auch Zeilenumbrüche darstellen, wenn man den WrapMode von DefaultCellStyle von DataGridViewTextBoxColumn auf true setzt.

Cheers,
Ralf

Windows Forms: NumericTextBox

Ab Werk bei Windows Forms gibt es leider keine numerische Textbox. Ich habe mich dabei ertappt, dass ich das in jedem Projekt neuprogrammiert habe. Heute soll damit Schluss sein: Nach einem kurzen Besuch bei der Suchmaschine meiner Wahl fand ich ein Snippet, das ich gleich etwas anpasste (und auch noch weiter anpassen muss):

public class NumericTextBox : TextBox
{
    bool allowSpace = false;
    private bool isInt;

    // Restricts the entry of characters to digits 
    // (including hex), the negative sign,
    // the decimal point, and editing keystrokes (backspace).
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        base.OnKeyPress(e);

        NumberFormatInfo numberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat;
        string decimalSeparator = numberFormatInfo.NumberDecimalSeparator;
        //string groupSeparator = numberFormatInfo.NumberGroupSeparator;
        string negativeSign = numberFormatInfo.NegativeSign;

        string keyInput = e.KeyChar.ToString();

        if (Char.IsDigit(e.KeyChar))
        {
            // Digits are OK
        }
        else if (keyInput.Equals(decimalSeparator) || // keyInput.Equals(groupSeparator) ||
            keyInput.Equals(negativeSign))
        {
            // Decimal separator is OK
        }
        else if (e.KeyChar == '\b')
        {
            // Backspace key is OK
        }
        //    else if ((ModifierKeys & (Keys.Control | Keys.Alt)) != 0)
        //    {
        //     // Let the edit control handle control and alt key combinations
        //    }
        else if (this.allowSpace && e.KeyChar == ' ')
        {

        }
        else
        {
            // Swallow this invalid key and beep
            e.Handled = true;
            //    MessageBeep();
        }
    }

    public int IntValue
    {
        get
        {
            return Int32.Parse(this.Text);
        }
    }

    public double DoubleValue
    {
        get
        {
            return double.Parse(this.Text);
        }
    }
    protected override void OnValidating(CancelEventArgs e)
    {
        base.OnValidating(e);
        try
        {
            if (!isInt)
                this.Text = Math.Round(double.Parse(this.Text), 2).ToString("F2");
            else
                this.Text = Math.Round(double.Parse(this.Text), 0).ToString();
        }
        catch
        {
            e.Cancel = true;
        }
    }
    public bool AllowSpace
    {
        set
        {
            this.allowSpace = value;
        }

        get
        {
            return this.allowSpace;
        }
    }
    public bool IsInt
    {
        set
        {
            this.isInt = value;
        }

        get
        {
            return this.isInt;
        }
    }
}

Vorhandene Textboxen in den „Designer.cs“-Files suchen und ersetzen. Fertig!

Der Vorschlag kommt übrigens von MS direkt. Man hätte es aber auch direkt in VS integrieren können …
http://msdn.microsoft.com/en-us/library/ms229644(v=vs.80).aspx

Cheers,
Ralf

Report Viewer: Währungsausgabe mit FormatCurrency()

Bei der Währungsausgabe gibt es ein Problem über das vermutlich jeder, der Software für Unternehmen außerhalb von USA entwickelt, stößt.

In der Beschreibung von FormatCurrency z.B. im Expression-Dialog steht:

Returns an expression formatted as a currency value using the currency symbol defined in the system control panel. 

Das stimmt aber nicht! Einstellen kann man das Format in Eigenschaft Language des Report-Elements. Stellt man den Wert auf „de-DE“, dann sieht man auch Euro-Angaben mit Komma-Zahlen.

Cheers,
Ralf

Report Viewer: externe Bilder darstellen

Will man externe Bilder darstellen, könnte es sein, dass man über die Syntax der Pfadangabe stolpert. Ich hatte direkt den Pfad zum Bild eingetragen und war etwas verwundert, dass MS anhand der Backslashes in der Pfadangaben nicht von selbst auf den Dateizugriff kam. Man muss es also klar voranstellen, was man will. Report Viewer unterstützt Bilder über Http- und File-Zugriff:

  • Http:
    http://www.Beispiel.de/MeinBild.png
  • File:
    file:\\\D:\Ordner\MeinBild.png

Aus Sicherheitsgründen muss man zusätzlich den externen Zugriff bei Bildern auch erlauben:

reportViewer1.EnableExternalImages = true;

Cheers,
Ralf

Windows Forms: Grid-Container mit Hintergrundfarbe

Jeder der schon mit WPF (oder Silverlight) gearbeitet hat, empfindet es sicher wie ich als Qual wenn mit der älteren Technologie „Windows Forms“ arbeitet. In WPF gibt es eine Vielzahl von Containern, die einem eine Menge Arbeit abnehmen. Jeder der in WPF Stunden zubringt um einzelne Elemente neu zu verschieben, nur weil sich die Seitenbreite geändert hat, sollte sein Tun dringend überdenken.

Immer wenn ich also „Back to the roots“ gehe und ein Windows Forms-Projekt bearbeite, dann vermisse ich bespielsweise das Grid-Element, das sehr viele Elemente prozentual über den kompletten Bereich verteilen kann. Es gibt unter Windows Forms allerdings ein Element namens TableLayoutPanel, das ein bisschen Ähnlichkeit hat … allerdings mit der Eleganz einer Bahnschranke :-)

Hier ein paar Einschränkungen:
– Das Ausrichten übereinander ist nicht möglich.
– Es kann nur ein Element pro Zelle eingefügt werden
– Copy & Paste: Das neue Element wird in die letzten Zeile erstes Feld eingefügt
– Die Performance bei vielen UI-Elementen ist leider nicht besonders
– Bei einem Resize der Komponente könnte es flackern
– Zeilen und Spalten lassen sich nicht in der Design-Ansicht einfärben

Will man z.B. eine unterschiedliche Hintergrundfarbe für die erste und dritte Spalte haben, dann muss man das CellPaint-Ereignis abfangen und folgenden Handler programmieren:

void tableLayoutPanel1_CellPaint(object sender, 
        TableLayoutCellPaintEventArgs e)
{
    if (e.Row == 0 || e.Row == 2) {
        Graphics g = e.Graphics;
        Rectangle r = e.CellBounds;
        g.FillRectangle(Brushes.Blue, r);
    }
}

Besser als nichts. Ich setzte es gerne ein, wenn man schnell einen Prototypen basteln will.

Cheers,
Ralf

 

Report Viewer: Berichte mit Master-Detail-Ansicht

Grundsätzlich ist ja der Aufbau der Reports so, dass alles von oben nach unten abgearbeitet wird. Wenn wir beispielsweise zwei Tabellen (Tablix-Elemente) mit Schülern und Noten untereinander setzen, dann bekommen wir zuerst alle Schüler und danach die Notenliste.

In einem Bericht möchte man aber häufig eine kombinierte Ansicht. Man möchte nacheinander alle Noten pro Schüler … und das am besten seitenweise getrennt.

Wenn man das mit RDLC-Files machen möchte dann bereitet man die Daten am besten in einer flachen Tabelle vor. Jede Zeile hat also neben der Schülerinformation (z.B. Name, Geburtsdatum, …) auch die Informationen zu der einzelnen Note (z.B. Fach, Note).

In der Design-Ansicht des Berichts, muss man dann die Notentabelle in ein List-Elemente packen. Bei diesem List-Element stellt man unter „Row Properties“ eine Gruppierung über die Schüler ein und den Seitewechsel nach jedem Schüler.

Die Tabelle innerhalb bekommt dann automatisch alle Zeilen dieses Schülers. Wenn man in der Tabelle eine „Column Group“ mit Gruppierung über das Fach definiert, dann sieht man für jede Note des jeweiligen Fachs eine Spalte. Bilder dazu folgen, wenn ich mehr Zeit habe …

Streng genommen ist ein List-Element (mittlerweile) ein spezielles Tablix-Element. Beispiel zu beiden Varianten findet man hier:

http://www.gotreportviewer.com/masterdetail/index.html

Cheers,
Ralf

Report Viewer: Es muss nicht immer teuer sein

Bisher dachte ich, man bräuchte zwingend ein „Third-Party“-Produkt, um praktikabel Berichte unter .NET (Windows Forms) zu erzeugen. Viele Stimmen sagten immer, dass es zu kompliziert wäre mit den Boardmitteln von MS einen Ausdruck zu erzeugen oder PDF-Dokumente zu generieren.

Mit der Report Viewer Engine ist dies aber meiner Meinung nach durchaus möglich. Sie ist in Visual Studio integriert und bedarf beim Deployment lediglich einer zusätzlichen Setup-Anwendung (man kann bestimmt das auch über ein MSM-File in das eigene Setup einbauen, aber Setups sind bei unseren Projektentwicklungen nicht das Thema).

Als Einstieg hatte ich mir einfach den ersten Treffer bei Google angesehen und dabei auch gleich ein paar nette Beispiele entdeckt:
http://www.gotreportviewer.com/

Natürlich ist das ganze nicht so komfortable wie gekaufte Produkte und hat leider auch ein paar Macken, die man relative schnell entdeckt und sich deshalb auch etwas über Microsoft wundert :-)

  1. Ärgerlich ist, dass bei der Undo- bzw. Redo-Programmierung gespart wurde. Ich hatte ein paar Mal erlebt, dass bei Redo sich Visual Studio verabschiedete und Undo nicht den letzten Schritt wiederherstellte, sondern einen der ersten Schritte … Auf Redo verichte ich ganz, speichere deshalb vor Undo lieber regelmäßig ab.
  2. Im Internet sind häufig ältere Samples zu finden, die dann in VS 2010 zuerst hochkonvertiert werden. Führt man mit der neue VS-Version die beschriebenen Schritte in der IDE durch kommt es leider hin und wieder  vor, dass das Verhalten beider Varianten  nicht identisch ist. Da hilft ein Blick in die XML-Struktur der RDLC-Datei.
  3. Hin und wieder bleibt das „Report Data“-Fenster auch in der Codeansicht offen und wird dann nicht neugezeichnet. Sieht hässlich aus, stört aber eigentlich nicht wirklich.

Es lohnt sich mal einen Versuch zu wagen. Setzt man rdlc-Files gepaart mit xsd-Files bekommt man auch mit MS-Mitteln einen ansprechenden Bericht unter Windows-Forms hin ohne eine Zeile zu coden.

Cheers,
Ralf