Wie ich programmieren lernte.

2 09 2012

In meinem Artikel über den Raspberry Pi habe ich ja schon angekündigt, dass das Prinzip, welches man verfolgt, genau richtig ist. Eine Maschine zu schwach für die neusten Spiele, stark genug um alle Möglichkeiten beim Experimentieren und Probieren zu haben.
Dieses Prinzip hat auch mich vor vielen Jahren an den Rechner gebracht. Während der Großteil schon einen 486er zu Hause stehen hatte, ein Teil schon zum Pentium wechselte, bekam ich meinen ersten eigenen Rechner. Einen 286er. Mit Turbotaste! Fun-Fact extra für @moellus: ein Highscreen!
Spielen konnte ich natürlich auch mit der Kiste. Allerdings eher einfache Sachen wie Lemmings, Accolade Grand Prix Circuit und das aufwendigste war F15 Strike Eagle II.
Doch es interessierte mich viel mehr. Die Kiste aufgeschraubt, geschaut, was funktioniert noch, wenn ich dieses und jenes abstecke oder ausbaue. Durch einfaches Probieren merkte ich, was essenziell ist und was unnütz. Nachdem ich die Hardware zumindest schon mal gesehen hatte und sie keine einfache Blechkiste mehr war, hab ich mich der Software gewidmet.
Basic fand ich persönlich doof, auch wenn ich bei einem Bekannten an seinem Sinclair Z80 viel Spaß damit hatte.
Irgendwie bin ich zu Turbo Pascal gekommen. Die 5er Version lief schnell und zuverlässig und ich konnte mit dem Programmieren beginnen. Damals gab es zwar schon das Internet, doch die Zugänge waren langsam und teuer. Glücklicherweise kam ich anders an alle möglichen Informationen. In Bekanntenkreis meiner Eltern wollte jemand seine gesammelten alten Computermagazine wegwerfen. Im Gegensatz zu heute enthielten die Hefte noch Unmengen an Listings, abgedrucktem Code verschiedenster Programme. Ich habe mich versucht in die Programme einzulesen, habe Teile abgetippt um zu sehen, was sie machen. Immer mehr hab ich verstanden und konnte somit auch eigene Programme schreiben. Nichts was die Welt bewegt aber kleine Programme die mich mit einem gewissen Stolz in meinem jungen Jahren erfüllt haben. Ich konnte etwas schreiben und der Computer tat danach genau das, was ich wollte – zumindest wenn ich nicht mal wieder irgendwo einen Fehler hatte. Ich möchte gar nicht wissen wie viele Tage und Nächte ich wirklich daran gesessen habe, bis ich programmieren konnte.
Die Art und Weise, wie ich Pascal gelernt habe, nutze ich heute noch um andere Sprachen zu lernen. Als ich mit Python anfing, habe ich Quelltexte aus dem Netz besorgt, kleine Tools und Skripte mussten herhalten, damit ich mich einarbeiten konnte. Es ging ohne größere Schwierigkeiten: Lesen, verstehen, ausprobieren, verbessern, Trial and Error quasi.
Hört auf dicke Bücher zu lesen und Unmengen an Zeit damit zu vergeuden.
Schnappt euch Codes und analysiert sie. Schreibt eigene Programme für eure Bedürfnisse.
Ihr könnt nichts kaputt machen. Im Zusammenspiel mit einem Versionsverwaltungssystem seid ihr auf der absolut sicheren Seite. Ein Hilfsmittel, welches mir zu Dos-Zeiten fehlte.

Also schreibt euch nicht ab, lernt programmieren!





ASP.NET – Stolperfalle Gridview sortieren

16 08 2007

So ein Gridview ist schon ein tolles Control.

Einfach die passende Datenquelle aktiviert, dann Paging und Sortierung aktivieren und alles ist funktioniert prächtig und sieht professionell aus.

Allerdings bin ich auf ein Problem gestoßen. Ich habe Spalten in meinem Gridview die ich per Templatefield erzeugt, um z.B. eine Grafik anzuzeigen. Da die Grafiken Werte darstellen, möchte ich auch eine Sortierung ermöglichen. Ich habe z.B. die Werte 1-3, die werden mit Kreisen in den Farben Rot, Gelb, Grün dargestellt. Aufsteigen sortiert würde bedeuten erst Grün dann Gelb und als letztes Rot, absteigend wäre dann umgekehrt.

Bei einem Templatefield muss man gesondert angeben nach welchem Wert sortiert werden soll. Dies habe ich mittels folgender Codezeile getan.

<asp:TemplateField SortExpression="uebID">

Leider konnte ich dann immer noch nicht sortieren. Wo lag das Problem? Nach verzweifelter Suche hab ich heraus gefunden, das ASP.NET nur solche TemplateFields sortiert, die kein HeaderTemplate besitzen. Brauch ich auch nicht, ich will ja nur den Inhalt der Spalten anpassen und nicht den Inhalt der Kopfzeile. Also überall HeaderTemplate entfernt. Damit die Spalte aber trotzdem eine Überschrift besitzt habe ich die Befehlszeile von oben wie folgt angepasst:

<asp:TemplateField SortExpression="uebID" HeaderText="Priorität">

Siehe da, das Sortieren funktioniert ohne Probleme!





ASP.NET – Headergrafik bei sortiertem Gridview

15 08 2007

Wenn ich mir meine Pagehits so anschaue, scheinen sich viele für den Gridview & Checkbox-Artikel zu interessieren.

Deshalb nun ein weiterer Artikel zu diesem Thema. Gridviews lassen sich super einfach sortieren, nur leider wird nie angezeigt nach welcher Spalte gerade sortiert wird bzw. ob aufsteigend oder absteigen.

Abhilfe kann man sich recht einfach schaffen:

public void gridJobs_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if ((e.Row != null) && e.Row.RowType == DataControlRowType.Header)
        {
            foreach (TableCell cell in e.Row.Cells)
            {
                if (cell.Controls.Count > 0)
                {
                    LinkButton button = cell.Controls[0] as LinkButton;
                    if (button != null)
                    {
                        Image image = new Image();
                        image.ImageUrl = "image/empty.gif";
                        if (gridJobs.SortExpression == button.CommandArgument)
                        {
                            if (gridJobs.SortDirection == SortDirection.Ascending)
                                image.ImageUrl = "image/sort_up.gif";
                            else
                                image.ImageUrl = "image/sort_down.gif";
                        }
                        cell.Controls.Add(image);
                    }
                }
            }
        }
    }

GridJobs heißt mein Gridview, das müsst ihr auf euren Code anpassen. Es gibt drei Grafiken, eine ist einfach nur durchsichtig (empty.gif), ein Pfeil nach oben (sort_up.gif) für aufsteigende Sortierung und einen Pfeil nach unten (sort_down.gif), für die absteigende Sortierung.Damit die oben genannte Prozedur auch ausgeführt wird müsst ihr noch folgendes in der ASP.NET-Seite zu eurem Gridview hinzufügen.

OnRowCreated="gridJobs_RowCreated"

Viel Spaß & Erfolg!





ASP.NET – Checkbox im Gridview

31 07 2007

Ich stand heute vor dem Problem, dass ich eine Checkbox innerhalb eines Griedviews brauchte. Die viel mir ein, das ich einen Vodcast dazu gesehen habe.

Ganz konnte ich es nicht anwenden, zum Einen nutze ich C# und zum anderen hab ich meinen Gridview innerhalb eines Ajax-UpdatePanels – somit soll nicht nur erfasst werden, welche Checkboxen irgendwann mal angeklickt wurden, sondern ich will nur den wirklichen aktuellen Status.

Ich bin mir sicher, meine Anpassungen sind nicht perfekt, ich beschäftige mich aber noch nicht all zu lang mit C#, deshalb bitte ich um Nachsicht. Verbesserungsvorschläge nehme ich aber gerne an!

Der Typ „HybridDictionary“ ist nicht in „System.Collections“ zu finden sondern in „System.Collections.Specialized“.

using System.Collections.Specialized;

Nun noch meine Funktion die Aufgerufen wird, wenn der Wert einer Checkbox sich ändert.

Achtung! Meine Variablen habe ich nicht so genannt wie die Variablen im Vodcast. Ich hoffe, dank der Kommentare, ist es trotzdem verständlich.

protected void chkSaveJob_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox chkGvSaveJob = ((CheckBox)sender);                             // Aktuelle Checkbox
        GridViewRow selGvRow = ((GridViewRow)chkGvSaveJob.NamingContainer);     // Selektierte Reihe des Gridvies
        if (Session["selIndexes"] == null)                                      // Sessionvariable "selIndexes" nicht gesetzt?
        {
            HybridDictionary dictChk=new HybridDictionary();                    // neues HybridDictionary
            if (chkGvSaveJob.Checked)                                           // Checkbox angehakt?
                dictChk[selGvRow.Cells[0].Text] = selGvRow.Cells[0].Text;       // wenn ja dann ID speichern
            else
                if (dictChk[selGvRow.Cells[0].Text] != "")
                    dictChk.Remove(selGvRow.Cells[0].Text);                     // wenn nein, Eintrag entfernen
            Session["selIndexes"]=dictChk;                                      //  Sessionvariable wieder befüllen
        }
        else                                                                    // Sessionvariable "selIndexes" gesetzt
        {
            HybridDictionary dictChk=((HybridDictionary)Session["selIndexes"]); // HybridDictionary aus Session auslesen
            if (chkGvSaveJob.Checked)                                           // restliche Bearbeitung analog zum oberen Teil
                dictChk[selGvRow.Cells[0].Text] = selGvRow.Cells[0].Text;
            else
                if (dictChk[selGvRow.Cells[0].Text] != "")
                    dictChk.Remove(selGvRow.Cells[0].Text);

            Session.Add("selIndexes",dictChk);
        }
    }