Posts
231
Comments
64
Trackbacks
4
January 2006 Entries
Sorting bei Datagrid ohne Verwendung von ObjectDataSource

Verwendet man das DataGrid Objekt zur Anzeige der Daten ohne das Objekt "ObjectDataSource" dann steht die Funktionen Paging nicht zur Verfügung. Diese lassen sich zwar aktivieren, jedoch wird das Ereignis Sorting nicht abgefangen und es kommt der folgende Fehler:

Die GridView Grid1 löste das Ereignis Sorting aus, das nicht behandelt wurde.

Unter der URL http://www.learnasp.com/freebook/learn/cs_GridViewSortingNoDataSourceControl.aspx habe ich eine Lösung in C# gefrunden ich für meinen Fall auf VB.NET umgschrieben habe.

<%@ Page Language="VB" strict="false" explicit="true" Debug="true" Title="..." %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>

<html>
<script runat="server">

Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs)

   Dim objDataSet As DataSet = New DataSet
   Dim StrConnect, StrSelect As String

   StrConnect = "..."

   Dim objConnection As OleDbConnection = New OleDbConnection
   objConnection.ConnectionString = StrConnect

   StrSelect = "..."
   Dim objCommand As OleDbCommand = objConnection.CreateCommand()
   objCommand.CommandText = StrSelect

   Dim objAdapter As OleDbDataAdapter = New OleDbDataAdapter
   Dim objDataTable As New DataTable
   objAdapter.SelectCommand = New OleDbCommand(StrSelect, objConnection) 
   objAdapter.SelectCommand.Connection.Open()
   objAdapter.Fill(objDataTable)
   Grid1.DataSource = objDataTable
   Grid1.DataBind()

End Sub

'*** gewählte Seite anzeigen
Sub Grid1_PageIndexChanging(ByVal Sender As Object, ByVal e As GridViewPageEventArgs)
   Grid1.PageIndex = e.NewPageIndex
   Grid1.DataBind()
End Sub

'***Sortierkriterium ein- oder ausgeben
Property GridViewSortDirection() As String
   Get
      If IsNothing(ViewState.Item("GridViewSortDirection")) Then
         Return "desc"
      End If
      Return ViewState.Item("GridViewSortDirection")
   End Get
   Set(ByVal Value As String)
      ViewState.Item("GridViewSortDirection") = Value
   End Set
End Property


'*** Sortierkriterium ändern
Function GetSortDirection()
   Dim GridViewSortDirectionNew As String
   Select Case GridViewSortDirection
      Case "DESC"
         GridViewSortDirectionNew = "ASC"
      Case "ASC"
         GridViewSortDirectionNew = "DESC"
      Case Else
         GridViewSortDirectionNew = "DESC"
   End Select
   GridViewSortDirection = GridViewSortDirectionNew
   Return GridViewSortDirectionNew
End Function


'*** Sortierung ändern ud auf der gleichen Seite bleiben
Sub grid1_Sorting(ByVal Sender As Object, ByVal e As GridViewSortEventArgs)
   Dim myDatatable As New DataTable
   myDatatable = Grid1.DataSource

   Dim myPageIndex As Integer = Grid1.PageIndex
   Dim mySortdirection As String = GetSortDirection()
   Dim MyDataView As New DataView(myDatatable)

   MyDataView.Sort = e.SortExpression & " " & mySortdirection
   Grid1.DataSource = MyDataView
   Grid1.DataBind()
   Grid1.PageIndex = myPageIndex

End Sub


</script>
<head id="Head1" runat="server">
</head>
<body>

<form id="Form1" runat="server" method="post">


<asp:GridView ID="Grid1" runat="server" AutoGenerateColumns="False" AllowPaging="True" PageSize="3" AllowSorting="True" OnSorting="grid1_Sorting" OnPageIndexChanging="grid1_PageIndexChanging">
<columns>
<asp:BoundField DataField="Datum" HeaderText="datum" SortExpression="Datum" />
<asp:BoundField DataField="titel" HeaderText="Titel" SortExpression="titel"/>
</columns>
</asp:GridView>

</form>

</body>
</html>

posted @ Tuesday, January 31, 2006 11:45 AM | Feedback (1)
Tipp zu Page.Databind()

Page.Databind() sollte man mit Bedacht einsetzen. Verwendet man mehrere Serverobjekte die mit Daten gefüllt werden sollen und man beim letzten page.databind() verwenet, dann bleiben die anderen Severobjekte leer und werden gar nicht angezeigt.

posted @ Sunday, January 29, 2006 8:51 PM | Feedback (0)
RSS-Feed erstellen

Einen RSS-Feed mit ASP.NET zu erstellen geht ziemlich schnell:

Daten einlesen und an einen Repeater binden und die Items des Repeaters formatieren. Ich zeige hier nur den Teil des Skript der den Repeater betrifft. Für die Datenbindung gibt es ja verschiedene Wege.

<% Response.ContentType = "text/xml"%>
<?xml version="1.0" encoding="utf-8"?>

<asp:Repeater ID="Repeater1" runat="server" >
<headerTemplate>
   <rss version="2.0"
   <channel> 

   <title>dot-net-jobs.de</title>
   <description>Aktuelle .NET - Jobs!</description>
   <link>http://www.dot-net-jobs.de</link>
   <image></image>
</headerTemplate>

<itemTemplate>
<item>
   <title><%# eval("titel") %></title>
   <link>http://www.dot-net-jobs.de/detail.aspx?lfdnr=<%#Eval("lfdnr")%></link> 
   <author><%#Eval("firma")%></author>
   <pubdate><%#Eval("datum")%></pubdate>
</item>
</itemTemplate>

<FooterTemplate>
   </channel>
   </rss>
</footerTemplate>

</asp:Repeater>

posted @ Saturday, January 28, 2006 10:10 PM | Feedback (0)
Fürs Archiv: Connection - DataApapter - DataSet - DataBind

Fürs Archiv ein Beispiel für das Einlesen eines Select-Ergebisses mit DataAdapter in ein DataSet mit DataBind an ein Control:

Dim objDataSet As DataSet = New DataSet
Dim StrConnect, StrSelect As String

StrConnect = " ... "

Dim objConnection As OleDbConnection = New OleDbConnection
objConnection.ConnectionString = StrConnect

StrSelect = " ... "
Dim objCommand As OleDbCommand = objConnection.CreateCommand()
objCommand.CommandText = StrSelect

Dim objAdapter As OleDbDataAdapter = New OleDbDataAdapter
objAdapter.SelectCommand = New OleDbCommand(StrSelect, objConnection)
objAdapter.SelectCommand.Connection.Open()
objAdapter.Fill(objDataSet, " ... ")
DataList1.DataSource = objDataSet
Page.DataBind()

posted @ Thursday, January 26, 2006 9:42 AM | Feedback (0)
Validierung im ASP.NET Webformular

Will man in einem ASP.NET Webformular die E-Mail-Adresse 2 mal validieren, z.B. ob gültig und ob E-Mail-Adresse eingetragen ist, sollte man Display="Dynamic" verwenden, damit dier Fehlermeldungen an der gleichen Stelle erscheinen (vorausgesetzt die Fehlemeldungen steh in dem Tabellenfeld neben dem Eingabefeld).

<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server" ControlToValidate="email" ErrorMessage="* E-Mail fehlt" Display="Dynamic">
</asp:RequiredFieldValidator><asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="email"
ErrorMessage="* E-Mail ist nicht korrekt" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" Display="Dynamic"></asp:RegularExpressionValidator>
</td>

posted @ Wednesday, January 25, 2006 9:10 PM | Feedback (1)
Herkunft des Namens AJAX

Die Herkunft des Namens AJAX geht zurück auf Jesse James Garrett der in einem Artikel den Namen AJAX vorgeschlagen /geprägt hat (18.02.2005):

 http://www.adaptivepath.com/publications/essays/archives/000385.php

posted @ Friday, January 20, 2006 1:27 PM | Feedback (0)
Wie man DataReader nicht benutzen sollte

Wie man DataReader nicht benutzen sollte ?

Man sollte den DataReader nicht benutzen um in ASP.NET wie im historischen ASP Daten auszugeben:

Dim DBConnection As OleDbConnection = New OleDbConnection
Dim SelectStatement As String

SelectStatement = "Select * From ... "

DBConnection.ConnectionString = " ... "
DBConnection.Open()

Dim OleDbCommand As OleDbCommand = New OleDbCommand(SelectStatement, DBConnection)
Dim myReader As OleDbDataReader
myReader = OleDbCommand.ExecuteReader

Do While myReader.Read()
    ...
    ...
Loop

Mal davon abgesehen dass es bei ASP.NET keine Recorsets mehr gibt, ist es viel besser die Daten nach dem Einlesen an ein Objekt, z.B. DataList oder Repeater, zu binden.

posted @ Wednesday, January 18, 2006 9:55 PM | Feedback (1)
Was ist AJAX ?

AJAX (Asynchronous JavaSvript and XML) besteht aus einer Kombination von bestehenden Techniken wie: DHTML, Javascript und XMLHTTP und steht für ein Konzept, um Daten zwischen einem Server und dem Browser auszutauschen, ohne dass die Seite komplett neu geladen werden muss.

Per Javascript kann auf das Browser DOM (Document Object Model) zugegriffen werden, für die Formatierung wird CSS verwendet.

Das XMLHtpRequest Objekt erlaubt einen asynchronen  Datenaustausch mit dem Server. Dabei können verschiedene Datenformate wie HTML und XML verwendet werden.

Die Kombination dieser Techniken erlaubt es das UserInterface von Webseiten nutzerfreundlicher zu gestalten, indem z.B. nur die Teile der Webseiteneu geladen und dargstellt werden, die sich verändert haben.

 

posted @ Wednesday, January 18, 2006 9:39 AM | Feedback (0)
Fürs Archiv: Werte einer CheckBoxList einlesen (C#)

Die selektierten Werte einer CheckBoxList kann mit der folgenden Schleife abfragen:

for (int i=0; i<checkboxlist1.Items.Count; i++)
{
   if (checkboxlist1.Items[i].Selected)
   {
   ... mach was damit ...
   }
}

posted @ Tuesday, January 17, 2006 1:59 PM | Feedback (0)
Tabellenzeilen ein- und ausbelden

Für viele Internetanwendungen kann es sinnvoll sein Tabellenzeilen dynamisch ein- und auszublenden. Hier ist ein Beispiel für IE. Diese Lösung arbeiet mit CSS-Vorlagen und einer Javascript-Funktion:

<style type="text/css">
<!--
.rowtosee {display:table-row;} /* diese Zeile ist sichtbar */
.rollout {display:none;} /* diese Zeile ist nicht sichtbar */
-->
</style>

Folgende Javascript-Funktionen werden benötigt:

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

//das Attribut einer ID ändern
function writeIDClass(ID,Attribs,Value) {
   obj=document.getElementById(ID);
   eval("obj.style."+Attribs+"='"+Value+"'");
}
var BereichOld = "";
var BereichAnzahl;

function Show(bereich,anzahl) {

    //neuen Bereich einblenden
   for(i=1;i<=anzahl;i++) {    
        writeIDClass(bereich+"-"+i,"display","block");
    }
    
    //aten Bereich ausblenden
    if (BereichOld != ""){
     for(i=1;i<=BereichOldAnzahl;i++) {        
         writeIDClass(BereichOld+"-"+i,"display","none");    
        }
    }
    
    //die Werte des alten Bereiches merken
    BereichOld=bereich;    
    BereichOldAnzahl=anzahl;
}

</script>

In unserer HTML-Beispiel-Tabelle müssen die einzelnen Zeilen mit IDs versehen werden:

<table width="500" border="0" cellspacing="2" cellpadding="4">
<tr>
<td height="50" id="zeile1" class="rowtosee" onClick="Show('zeile1',2)" bgcolor="#FF0000">&nbsp;</td>
</tr>
<tr>
<td height="50" id="zeile1-1" class="rowtohide" bgcolor="#0000FF">&nbsp;</td>
</tr>
<tr>
<td height="50" id="zeile1-2" class="rowtohide" bgcolor="#0000FF">&nbsp;</td>
</tr>
<tr>
<td height="50" id="zeile2" class="rowtosee" onClick="Show('zeile2',2)" bgcolor="#FF00FF">&nbsp;</td>
</tr>
<tr>
<td height="50" id="zeile2-1" class="rowtohide" bgcolor="#00FFFF">&nbsp;</td>
</tr>
<tr>
<td height="50" id="zeile2-2" class="rowtohide" bgcolor="#00FFFF">&nbsp;</td>
</tr>
</table>

Bemerkungen:

Die Zeilen die zu Beginn sichtbar sein sollen müssen die Klasse "rowtosee" haben, die Zeilen die unsichtbarsein sollen haben die Klasse "rowtohide".

Mit onClick auf die Zeile werden der Javascript-Funktion Show zwei Variablen übergeben: Der name der ID der Zeile sowie die anzahl der einzublenden folgenden Zeilen.

Alles zusammen man hier als lauffähigtes Beispiel sehen: beispiel_hide_show.html (1,7 KB)

posted @ Tuesday, January 17, 2006 11:15 AM | Feedback (0)
Funktion für die Benutzung von DataReader

Hier eine kleine Funktion mit welcher man per DataReader Daten aus der Datanbenk auslesen kann:

Function GetDataReader(ByVal SQL_befehl) As IDataReader
   Dim connection As New OleDbConnection(" ... ")
   Dim command As New OleDbCommand(SQL_befehl, connection)
   connection.Open()
   Return command.ExecuteReader(CommandBehavior.CloseConnection)
End Function

Das Ergebnis kann anschliessend an ein Daten-Objekt gebunden werden:

Dim Daten As IDataReader = GetDataReader("select * from ... ")

objekt.DataSource = Daten
objekt.DataBind()

posted @ Monday, January 16, 2006 6:46 PM | Feedback (0)
Paging bei Datagrid ohne Verwendung von ObjectDataSource

Verwendet man das DataGrid Objekt zur Anzeige der Daten ohne das Objekt "ObjectDataSource" dann steht die Funktionen Paging nicht zur Verfügung. Diese lassen sich zwar aktivieren, jedoch wird das Ereignis PageIndexChanging nicht abgefangen und es kommt der folgende Fehler:

Die GridView Grid1 löste das Ereignis PageIndexChanging aus, das nicht behandelt wurde.

Wenn man dem Datagrid folgendes Ereignishandling und Funktion hinzufügt dann funktioniert ds Paging auch ohen das Objekt "ObjectDataSource":

<asp:datagrid ... AllowPaging="True" PageSize="10" OnPageIndexChanging="grid1_PageIndexChanging" ...>

Folgende Funktion führt das Paging aus:

Sub Grid1_PageIndexChanging(ByVal Sender As Object, ByVal e As GridViewPageEventArgs)
   Grid1.PageIndex = e.NewPageIndex
   Grid1.DataBind()
End Sub

 

posted @ Monday, January 16, 2006 11:35 AM | Feedback (1)
Tool für die Simulation von Bildschirmauflösungen

Wieder ein kleines Tool für das Archiv: SIZER

SIZER erlaubt es den Browser auf Standard-Bildschirmauflösungen einzustellen, z.B. 800x600 oder 1024x768. So kann man testen wie eine Webseite unter verscheidenen Auflösungen aussieht.

Dieses Freeware-Tool kann man sich downloaden unter: http://www.brianapps.net/sizer.html.

posted @ Sunday, January 15, 2006 12:24 PM | Feedback (1)
Fürs Archiv: Werte einer CheckBoxList einlesen (VB.NET)

Die selektierten Werte einer CheckBoxList kann mit der folgenden Schleife abfragen und in diesem Beispiel an einen Select-Befehl anhängen:

For i = 0 To cblObject.Items.Count - 1
   If cblObject.Items(i).Selected Then
      SelectStatement = SelectStatement & " and " & cblObject.Items(i).value & "=-1 "
   End If
Next

posted @ Friday, January 13, 2006 1:55 PM | Feedback (0)
Fenstergröße ermitteln

Für manche Internetanwendungen kannes notwendig sein die Größe eines PopUp-Fensters dem INhalt anzupassen, damit das PopUp-Fenster nicht so leer aussieht. Dafür kann man das folgende Javascript verwenden:

<SCRIPT LANGUAGE="JavaScript">
<!--

function Initialisieren()
{
var breite = eval(document.all.Inhalt.offsetWidth);
var hoehe = eval(document.all.Inhalt.offsetHeight);
resizeTo(breite,hoehe);
}
//-->
</script>

Diese Funktion muss mit onLoad im Body-Tag aufgerufen werden und geht davon aus, dass der Inhatlt der Seite in einer Tabelle mit der ID="inhalt" steht.

<body onload ="Initialize()">

<table border="0" cellpadding="1" cellspacing="1" width="100%" id="Inhalt">

Die Breite der Tabelle hängt von der Fenstergröße an, die Höhe der Tabelle hängt von dem Inhalt ab. Diese Werte können nun mit eval(document.all.Inhalt.offsetWidth und eval(document.all.Inhalt.offsetHeigth) ausgelesen und an die Funktion resizeTo übergeben werden.

posted @ Tuesday, January 10, 2006 12:48 PM | Feedback (0)
Tool für Textbausteine

Nachdem ich in Outlook immer nioch die Funktion Textbausteine vermisse, habe ich mich nach einen entsprechenden Tool umgesehen. Es gibt mehrere Tools auf dem Markt ich habe mich für Phrase entschieden. Das Tool ist in der Taskbar jederzeit erreichbar und fügt den ausgewählten Textbaustein an die Stelle des Cursors ein:

posted @ Monday, January 09, 2006 8:49 AM | Feedback (0)
Jacascriptfehler unterdrücken

Javascript-Fehler sind nicht schön, vor alle wenn der Kunde , bzw. der Benutzer diese bemerkt.

Mit der folgenden Funktion, die ganz oben im Javascript-Teil stehen muss, kann man Javascript-Fehler abfangen:

<SCRIPT>
// Javascript Fehler unterdrücken
onerror = ErrorFunction;
function ErrorFunction()
{
return true;
}
</SCRIPT>

posted @ Sunday, January 08, 2006 10:09 AM | Feedback (1)