Posts
231
Comments
64
Trackbacks
4
February 2006 Entries
Titel bei MasterPages

Bei Verwendung von MasterPages lässt sich der Titel der Webseiten in den einzelnen Contentseiten mit dem folgenden Befehl festlegen:

Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs)
   Page.Title = "Impressum"
End Sub

posted @ Tuesday, February 28, 2006 9:13 PM | Feedback (1)
Funktionen für Datei-Operationen

Funktionen für Datei-Operationen die man immer wieder mal braucht:

Datei einlesen:

Dim Dateiname As String = "C:\test.txt"
Dim objReader As New System.IO.StreamReader(Dateiname)
TextBox1.Text = objReader.ReadToEnd
objReader.Close()

Prüfen ob Datei existiert:

Dim dateiname As String = "C:\test.txt"
If System.IO.File.Exists(dateiname ) = True Then
...
End If

 

posted @ Sunday, February 26, 2006 8:42 AM | Feedback (0)
Navigation bei MasterPages

Wenn man die MasterPage-Funktion von ASP.NET 2.0 mit einer horizontalen Navigaton verwenden möchte, muss man das Menü-Objekt folgendermassen verwenden:

<asp:Menu ID="Menu2"
runat="server"
DataSourceID="SiteMapDataSource1"
orientation="Horizontal"
StaticDisplayLevels="2"
StaticSubMenuIndent="10">

<StaticMenuStyle HorizontalPadding="2" VerticalPadding="2" />
<staticselectedstyle backcolor="LightBlue"/>
</asp:Menu>

<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Verwendet das Menü-Objekt die Datei "Web.Sitemap" - in welcher die Seitenstruktur abgebildet ist - dann wird die Startseite als erster Menüpunkt angezeigt. Die anderen Menüpunkte werden erst als PopUp-Menü sichtbar.

Möchte man das Menü jedoch horizontal darstellen, dann ist es notwendig folgende Eigenschaft anzugeben: "StaticDisplayLevels=2".

posted @ Friday, February 24, 2006 9:02 PM | Feedback (0)
Model-View-Controller (MVC)

Die Model-View-Controller Architektur geht auf die Smalltalk-Umgebung zurück.

Links zu MVC:
http://cristobal.baray.com/indiana/projects/mvc.html
http://msdn2.microsoft.com/en-us/library/ms978748.aspx
http://de.wikipedia.org/wiki/Model_View_Controller

Das Model-View-Controller-Konzept wird in vielen Bereichen moderner Softwareentwicklung eingesetzt und bedeutet die strikte Aufgabenverteilung bei einer Anwendung. So wird als Model die Datenquelle bezeichnet, die Daten unabhängig vom Erscheinungsbild liefert (also beispielsweise aus einer relationalen Datenbank). Die View zeigt diese Daten dann in passender Art und Weise an - bestimmt durch den »Look«, wie diese View die Daten anzeigt wird nicht vom Model beeinflusst.

Zwei Diagramme verdeutlichen dieses Konzept:

Der Controller kümmert sich um die Interaktion mit dem Benutzer (das Verhalten der Komponente). Wird beispielsweise in der angezeigten Tabelle ein Wert geändert, so teilt der Controller dies dem Model mit, welches wiederum die View darüber informiert - der neue Wert wird angezeigt. Der Controller ist also die Logik der Anwendung.

Der Vorteil dieser Aufgabenverteilung ist zum einen die Möglichkeit der Aufteilung in logische, unabhängige Klassen, wie auch die Möglichkeit, jeden der drei Teile jederzeit auszutauschen. Hierdurch ist bei Swing der Austausch des Look-and-Feels zur Laufzeit möglich.

Zusätzlich können Spezialisten für die einzelnen Teilaufgaben eingesetzt werden - der Designer entwickelt ein eigenes Look-and-Feel, während sich der Datenbankprogrammierer um das Model kümmert.


Ein Beispiel von Microsoft für MVC und ASP.NET findet man hier:
http://msdn2.microsoft.com/en-us/library/ms998540.aspx

Ein Beispiel für MVC mit ASP hier:
http://www.15seconds.com/issue/060817.htm

posted @ Thursday, February 23, 2006 1:52 PM | Feedback (0)
Voneinander abhängige Listboxen in einem Formular

In Formularen kommt es vor, dass man zwei Listboxen verwendet, deren Inhalt voneinander abhängig sind, z.B Rubrik und Unterrubrik

Hier ein Beispiel wie man so etwas mit ASP.NET realsieren kann.

<table cellpadding="2" cellspacing="1" border="0">
<tr>
<td>&nbsp;<strong>Artikel</strong>&nbsp;</td>
<td>&nbsp;<asp:TextBox ID="artikel" runat="server"></asp:TextBox>&nbsp;</td>
<td align="right">&nbsp;<strong>Rubrik</strong>&nbsp;</td>
<td>&nbsp;<asp:DropDownList ID="rubrik" AppendDataBoundItems="true" runat="server" AutoPostBack="true" OnSelectedIndexChanged="rubrik_click" Width="180">
<asp:ListItem Text="Bitte w&#228;hlen" Value="0"></asp:ListItem>
</asp:DropDownList>&nbsp;</td>
<td>
</td>
</tr>
<tr>
<td></td>
<td valign="top">
<table cellpadding="0" cellspacing="0">
<tr>
<td style="width: 3px"> <asp:CheckBox ID="volltextsuche" runat="server" /></td>
<td>Volltextsuche</td>
</tr>
</table>
</td>
<td>&nbsp;<strong>Unterrubrik</strong>&nbsp;</td>
<td>&nbsp;<asp:DropDownList ID="unterrubrik" AppendDataBoundItems="false" runat="server" AutoPostBack="false" Width="180">
<asp:ListItem Text="Bitte eine Rubrik w&#228;hlen" Value="0"></asp:ListItem>
</asp:DropDownList>&nbsp;</td>
<td>
<asp:Button ID="Button1" runat="server" Text="Artikel suchen" CssClass="button" /></td>
</tr>
</table>

Folgende VB.Net Funktionen werden benötigt:

Protected Sub rubrik_click(ByVal sender As Object, ByVal e As System.EventArgs) Handles rubrik.SelectedIndexChanged

strSQL = "select * from kaufhaus_unterrubrik where rubrik=" & rubrik.SelectedValue & " and anzahl > 0 order by name"
unterrubrik.DataSource = myDBConnect.SQLSelect(strSQL)
unterrubrik.DataTextField = "name"
unterrubrik.DataValueField = "lfdnr"
unterrubrik.DataBind()

'sql.Text = strSQL

End Sub

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

Getdata()

End Sub

Die Funktion Rubrik_klick füllt die zweite Listbox in Abhängigeit von der ersten aus und die Funktion Button1_Click führt die Suche aus.

 

posted @ Sunday, February 19, 2006 9:36 AM | Feedback (0)
DataReader in Datatable einlesen

Hier ein Beispiel wie man die Daten aus dem DataReader in ein Datatable einlesen kann:

   IDataReader reader = base.ExecuteReader(sql);
   if( reader == null ) return null;

   DataTable dataTable = new DataTable( "Report" );
   dataTable.Columns.Add( "City", typeof( int ) );
   dataTable.Columns.Add( "Site", typeof( string ) );
   dataTable.Columns.Add( "Developer", typeof( int ) );
   dataTable.Columns.Add( "Date", typeof( string ) );
   try {
    while( reader.Read() ) {
     DataRow dr = dataTable.NewRow();
     dr[0] = reader[0];
     dr[1] = reader[1];
     dr[2] = reader[2];
     dr[3] =  reader[3];
     dataTable.Rows.Add( dr );
    }
   }
   finally {
    reader.Close();
   }

posted @ Saturday, February 18, 2006 2:47 PM | Feedback (0)
RSS-Feed formatieren

RSS-Feeds werden normalerweise mit RSS-Readern gelesen, jedoch macht es ab und zu auch Sinn die RSS-Feeds im Layout der jeweiligen Seite zu formatieren.

Hier ein Beispiel wie so etwas geht, zunächst muss man in die Datei welche das RSS-Feed erzeugt das StyleSheet einbinden:

<?xml-stylesheet type="text/css" href="http://www.domaine.de/rss.css" ?>

Die CSS-Datei kann z.B. so aussehen:

rss {
    display: block;
    font-family: verdana, arial;
    font-size:12px;
}

rss_title {
    color: #307ea3;
    font-size:18px;    
}

title {
    display: block;
    margin: 5px;
    padding: 2px;
    color: #C7D800;
    font-size:18px;    
    font-weight:bolder;
}

item title {
    display: block;
    margin: 5px;
    padding: 2px;
    padding-left:15px;
    color: #307ea3;
    font-size:13px;
    font-weight:bolder;
    background:url("http://www.dot-net-jobs.de/images/bullet_quadrat.gif") no-repeat 1px 5px;
}

description {
    display: block;
    margin: 5px;
    padding: 2px;
}

item {
    display: block;
    padding: 2px 10px 2px 30px;
    color:#555;
    margin-top:10px;    
}


pubDate {
    color: silver;
    font-size:11px;
    padding: 5px;
    margin-left: 5px;
}

/* elemente verbergen */
link {
    display: none;
}

Das Beispiel kann man hier abrufen: http://www.dot-net-jobs.de/rss-feed.aspx

posted @ Thursday, February 16, 2006 3:30 PM | Feedback (0)
Bemerkungen zum neuen GridView (Datagrid)

Das neue (erweiterte) GridView von ASP.Net 2.0 hat neue praktische Funktionen wie  Sortierung und Paging. Diese funktionieren jedoch nur, wenn die Anbindung an die Datenbank per SqlDataSource o.a. erfolgt.

Geht man den klassischen Weg: DataAdapter, DataSet, DataBind, dann funktionieren diese Funktionen wie Sortierung und Paging nicht.

Man erhält die Fehlermeldung: 
"Die GridView Grid1 löste das Ereignis Sorting aus, das nicht behandelt wurde."

posted @ Tuesday, February 14, 2006 9:24 PM | Feedback (0)
Edit-Funktion bei DataList

Das DataList-Objekt kann man nicht nur zum Visualisieren von Daten verwenden, sondern die angezeigten Daten lassen sich auch veändern.

Hier ein kleines, vereinfachtes Beispiel aus der Warenkorb-Funktion eines Shop-Systems. Die ausgewählten Artikel werden im Warenkorb angezeigt und die Anzahl soll verändert werden können.

Beschreibung des Skriptes:

Per DataReader wird der Inhalt des Warenkorbes ausgelesen und mittels eines DataList-Objektes angezeigt.

Die Editmaske wird im <EditItemTemplate> Bereich definiert. Hier wird die Anzahl in einem HTML Server-Control zum ändern angezeigt. Damit wir für den Datenbank-Update die entsprechende ID haben, wird diese in einem Hidden-Field mitgeführt.

Im ASP:DataList -Tag definieren wir die Events die wir benötigen:

<ASP:DataList id="DataList" OnEditCommand="DataList_Edit" OnUpdateCommand="DataList_Update" OnCancelCommand="DataList_Cancel" runat="server">

In den Linkbuttons werden per CommandNames die Events, die ausgelöst werden sollen, festgelegt.

In der Warenkorbansicht wird über den Link "bearbeiten" der Editmodus dieser Zeile aufgerufen und die Anzahl kann geändert werden. Mit dem Link "speichern"  wird über das Event "Update" die Updare-Prozedur aufgerufen welche die Werte ID und Anzahl einliest und die Datenbank updated.

 

<%

@ Import Namespace="System.Data" %>
<%
@ Import Namespace="System.Data.SqlClient" %>

<

html>
<
script language="VB" runat="server">

Sub liste_erstellen()
   Dim strConnect, strSQL As String
   strConnect = System.Configuration.ConfigurationManager.AppSettings.Get("myConnection")
   strSQL =
"select id, kurztext, anzahl, preis , anzahl*preis as summe from kaufhaus_warenkorb"
   Dim DBConnection As New OleDbConnection
   DBConnection.ConnectionString = strConnect
   Dim ObjDbCommand As New OleDbCommand(strSQL, DBConnection)
   Dim daten As OleDbDataReader
   DBConnection.Open()
   daten = ObjDbCommand.ExecuteReader()
   DataList.DataSource = Daten
   DataList.DataBind()
   DBConnection.Close()
End Sub

Sub Page_Load(Sender As Object, E As EventArgs)
   If Not (Page.IsPostBack)
      liste_erstellen()
   End If
End Sub

Sub DataList_Edit(Sender As Object, E As DataListCommandEventArgs)
   DataList.EditItemIndex =
CInt(e.Item.ItemIndex)
   liste_erstellen()
End Sub

Sub DataList_Update(Sender As Object, E As DataListCommandEventArgs)
   Dim EditText As HtmlInputText
   Dim EditId As HtmlInputHidden  

   EditText = E.Item.FindControl("edit_anzahl")
   EditId = E.Item.FindControl(
"edit_id")
   Dim strConnect, strSQL As String
   strConnect = System.Configuration.ConfigurationManager.AppSettings.Get("myConnection")
   strSQL = "update kaufhaus_warenkorb set anzahl = " & EditText.Value & " where id=" & EditId.Value
   Dim DBConnection As New OleDbConnection
   DBConnection.ConnectionString = strConnect
   Dim ObjDbCommand As New OleDbCommand(strSQL, DBConnection)
   DBConnection.Open()
   ObjDbCommand.ExecuteNonQuery()
   DBConnection.Close()

   Nachricht.Text = "Anzahl ge„ndert auf: " & EditText.Value
   DataList.EditItemIndex = -1

   liste_erstellen()
End Sub

Sub DataList_Cancel(Sender As Object, E As DataListCommandEventArgs)
   
Nachricht.Text = "keine Žnderung"
   
DataList.EditItemIndex = -1
   liste_erstellen()
End Sub

Function formatEur(ByVal wert As String)
   formatEur =
String.Format("{0:c}", Decimal.Parse(wert))
End Function

</

script>

<

body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0">
<form id="Form1" runat="server">

<ASP:DataList id="DataList" OnEditCommand="DataList_Edit" OnUpdateCommand="DataList_Update" OnCancelCommand="DataList_Cancel" runat="server">

<HeaderTemplate>
<table border="0">
<tr><td> </td><td>Anzahl</td><td>Artikel</td><td align="right">Preis/Stk.</td><td align="right">Summe</td></tr>
</HeaderTemplate>

<ItemTemplate>
<tr>
<td width="130px" height="30">
<asp:linkbutton ID="Linkbutton4" CommandName="Edit" runat="server">bearbeiten</asp:linkbutton>
</td>
<td align="right"><%#Eval("anzahl")%></td>
<td><%#Eval("kurztext")%>&nbsp;</td>
<td align="right"><%#formatEur(Eval("preis"))%></td>
<td align="right"><%#formatEur(Eval("summe"))%></td>
</tr>
</ItemTemplate>

<EditItemTemplate>
<tr>
<td width="130px" height="30">
<asp:linkbutton ID="Linkbutton1" CommandName="Update" runat="server">speichern</asp:linkbutton>
<asp:linkbutton ID="Linkbutton5" CommandName="Cancel" runat="server">abbrechen</asp:linkbutton>
</td>
<td>
<input id="edit_anzahl" style="width:40" type="text" value='<%#eval("anzahl")%>' runat="server"/>
<input id="edit_id" type="hidden" value='<%#eval("id")%>' runat="server"/>
</td>
<td><%#Eval("kurztext")%>&nbsp;</td>
<td align="right"><%#formatEur(Eval("preis"))%></td>
<td align="right"><%#formatEur(Eval("summe"))%></td>
<td></td>
</tr>
</EditItemTemplate>

<FooterTemplate>
</table>
</FooterTemplate>

</ASP:DataList>

</form>

<asp:Label ID="Nachricht" runat="server" Text="Label"></asp:Label>

</
body>
</
html>
posted @ Monday, February 13, 2006 2:22 PM | Feedback (0)
Shoplösungen für die Homepage

Unter der Adresse http://www.shop-factory.de/ findet man zwei Shop-Lösungen für die eigene Homepage oder die Homepage eines Kunden:

  • eine MietShop-Lösung (inkl. Warenkorb, Runriken und Unterrubriken)
  • und eine FreShop Lösung
posted @ Saturday, February 11, 2006 9:08 AM | Feedback (0)
Vorteile und Nachteile von AJAX

Als Vor- und Nachteile von AJAX ist folgendes zu berücksichtigen:

Vorteile:

  • nur die Inhalte die sich verändert haben werden neu geladen
  • benutzerfreundlich, mehr windows-like
  • up-to-date


Nachteile:

  • ein Bookmark auf den aktuellen Inhalt zu setzen wird schwierig
  • die vor und zurück Navigaiion des Browsers funktioniert nicht
  • Suchmaschinen können den Inhalt von AJAX-Seiten nicht lesen und folglich nicht indexieren

 

posted @ Thursday, February 09, 2006 1:33 PM | Feedback (0)
Browserweiche mit Javascript

Für Designs von Webseiten, die unter allen modernen Browsern gleich aussehen sollen, ist es des öfteren notwendig die Darstellungsunterschiede der einzelnen Browser durch unterschiedliche Stylesheet-Vorlagen auszugleichen.

Dazu kann die folgende Funktion zur Browsererkennung verwendet werden:

<script language="javascript" type="text/javascript">

// globale Browser/OS Variablen definieren
_DOM=false; _All=false; _NS4=false; _NS6=false; _NS7=false; _OP=false; _IE4=false; _IE5=false; _IE6=false; _OtherBrowser=false; _Mac=false; _Win=false; _OS2=false;

// Browser/OS Variablen setzen
function CheckBrowser(){
var navAgent=navigator.userAgent.toLowerCase();
var appVer=navigator.appVersion.toLowerCase();
var versMinor=parseFloat(appVer);
var versMajor=parseInt(versMinor);
_Mac=(navAgent.indexOf("mac")!=-1);
_Win=((navAgent.indexOf("win")!=-1)||(navAgent.indexOf("16bit")!=-1));
_OS2=(navigator.platform=="OS/2")?true:false;
_All=(document.all)?true:false;
_DOM=(document.getElementById)?true:false;
_OP=(window.opera)?true:false;
_SAFARI=(navAgent.indexOf('safari')!=-1)?true:false;
var iePos=appVer.indexOf('msie');
if (iePos!=-1){
     versMinor=parseFloat(appVer.substring(iePos+5,appVer.indexOf(';',iePos)));
     versMajor=parseInt(versMinor);}
nav6Pos=navAgent.indexOf('netscape6');
nav7Pos=navAgent.indexOf('netscape/7');
if (nav6Pos!=-1){
     versMinor=parseFloat(navAgent.substring(nav6Pos+10));
     versMajor=parseInt(versMinor); }
var netsc=((navAgent.indexOf('mozilla')!=-1) && (navAgent.indexOf('spoofer')==-1) && (navAgent.indexOf('compatible') == -1)
         && (navAgent.indexOf('opera')==-1) && (navAgent.indexOf('webtv')==-1));
_NS4=(document.layers)?true:false;
_NS6=(netsc&&versMajor==6);
_NS7=(netsc);
var msie=(iePos!=-1);
_IE4=(msie&&versMajor==4);
_IE5=(msie&&versMajor==5);
_IE6=(msie&&versMajor==6);
_OtherBrowser=(!_NS4&&!_NS6&&!_OP&&!_IE4&&!_IE5&&!_IE6);
}

</script>

Ein Anwendungsbeispiel könnte so aussehen:

<script language="javascript" type="text/javascript">
    CheckBrowser();
    if(_NS7 || _NS6) document.write('<link rel="stylesheet" href="../css/styleNS6.css" type="text/css">');
    if(_IE5) document.write('<link rel="stylesheet" href="../css/styleIE5.css" type="text/css">');
    if(_SAFARI) document.write('<link rel="stylesheet" href="../css/StyleSAFARI.css" type="text/css">');
</script>

 

posted @ Wednesday, February 08, 2006 11:35 AM | Feedback (0)
Einer Dropdownliste nach dem Databind() nachträglich Items hinzufügen

In ASP.NET 2.0 gibt es jetzt die Möglichkeit einer Dropdownliste nach dem Databind() nachträglich Items hinzufügen.

Hierzu gibt es jetzt die Eigenschaft "AppendDataBoundItems", wenn diese auf "true" gesetzt ist, dann kann man nach dem Databind() der Dropdownliste noch Items hinzugefügt werden:

<asp:DropDownList AppendDataBoundItems="true" ID="kategorie" runat="server">
<asp:ListItem Text="Bitte wÃhlen" Value=0></asp:ListItem>
</asp:DropDownList>

 

posted @ Thursday, February 02, 2006 3:07 AM | Feedback (1)
Reguläre Ausdrücke in Web Forms

Für die Validierung von Web Server Controls (z.B. <asp:TextBox/>) gibt es die Möglichkeit einer Validierung von Texteingaben mittels regulären Ausdrücken (<asp:RegularExpressionValidator/>).

Mit regulären Ausdrücken kann kontextabhängig nach Textmustern gesucht werden. Eine regulärer Ausdruck ist deshalb nicht ein einfacher Suchstring, sondern die formale Beschreibung eines Textmusters.

Man kommt jedoch nicht umhin eigene reguläre Ausdrücke zu erstellen, hier einige Beispiele:

Nur 4 oder 5 Zahlen: "^\d{4,5}$"
mindestens 5 Zahlen "^[0-9]{5,}$"
mindestens 4 und max. 30 Zeichen: "^\S{6,30}$"
Zahlen im Format xxxx-xxxx-xxxx-xxxx    "[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}"

Einige nützliche Links hierzu:
Tutorial: http://gnosis.cx/publish/programming/regular_expressions.html
Nachschlagen: http://www.zvon.org/other/reReference/Output/index.html
Dokumentation bei Microsoft: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconcharacterescapes.asp
Reguläre Ausdrücke online testen: http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp

posted @ Wednesday, February 01, 2006 1:24 PM | Feedback (0)
CSharp-Klasse für DataReader

Für die Nutzung des DataReaders habe ich mir eine kleine Klasse geschrieben:

using Microsoft.CSharp;
using System.Data;
using System.Data.OleDb;

    public class DBConnect
    {
        private OleDbConnection DBConnection;
        private int ergebnis;

        public DBConnect()            // Verbindung Initialisieren
        {
            DBConnection = new OleDbConnection();
            DBConnection.ConnectionString = @" ... ";
        }

        public void Open()            // Verbindung öffnen
        {
            if (DBConnection.State != ConnectionState.Open)
            {
                DBConnection.Open();
            }
        }

        public void Close()            // Verbindung schiessen
        {
            if (DBConnection.State == ConnectionState.Open)
            {
                DBConnection.Close();
            }
        }

        public OleDbDataReader SQLSelect(string strDBSQL)            // SELECT Abfrage stellen
        {
            Close();
            Open();
            OleDbCommand objDBCommand = new OleDbCommand(strDBSQL,DBConnection);
            OleDbDataReader objDBReader = objDBCommand.ExecuteReader();
            return (objDBReader);
        }

        public int SQLExecute (string strDBSQL)
        {
            Close();
            Open();
            OleDbCommand objDBCommand = new OleDbCommand(strDBSQL,DBConnection);
            ergebnis = objDBCommand.ExecuteNonQuery();
            return (ergebnis);
        }

    } ///Ende class DBConnect


Damit lassen sich:

  • Select-Befehle übergeben und das Ergebnis mit Databind() an ein Objekt binden
  • Insert und Update-Befehle an die Datenbank absetzen


DBConnect myDBConnection = new DBConnect();
strSQL = "update ... ";
ergebnis = myDBConnection.SQLExecute(strSQL);

...

strSQL = "select ... ";
OleDbDataReader mySQLSelect = myDBConnection.SQLSelect(strSQL);
objKategorie.DataSource = OleDbDataReader
objKategorie.DataBind()

posted @ Wednesday, February 01, 2006 1:56 AM | Feedback (1)