DevTrain

Autor: Hannes Preishuber

Datagrid scrollt, Titel bleibt

Websites sind weniger benutzerfreundlich als Windows Anwendungen. Leider sind die meisten Websites so, weil der Komfort für den Entwickler weniger ist. Nehmen wir mal als Beispiel das Datagrid. Im Web fehlt die Möglichkeit das Grid zu scrollen und dabei die Titelzeile stehen zu lassen. Bei etwas längeren Datentabellen kann dies eine brauchbare Alternative zum Paging sein.

Im Design View des Datagrids sucht man das Proberty allerdings vergeblich. Also muss man wieder mal per Hand dafür sorgen.
Der Trick ist, das Datagrid nachdem es an den Browser geschickt wurde, am Client vom Browser per JScript umbauen zu lassen.
Dabei wird eine Tabelle mit 2 Zeilen erzeugt. In die erste Zeile kommt später der Header und in die zweite die Daten. Um dann noch Scrollen zu können muss man den Grid Body darum in ein DIV packen.



Das ganze besorgt für uns ein umfangreiches Jscript. Per HTC wird das Script an das Event Documentready gebunden. Das Script muss natürlich in einer eigenen Datei (hier scroll.htc) gespeichert werden. Im wesentlichen wird damit das DOM der HTML Seite zerpflückt, geändert und wieder zusammengesetzt. Details dazu sollten eher in Jscript Artikeln besprochen werden.

<PUBLIC:ATTACH event="ondocumentready" handler="hdlDR" />
<SCRIPT language="JScript">
function hdlDR()
{
   // Elemente erstellen
   var tableHeader = this.cloneNode(false);
   var tableBody  = this.cloneNode(false);
   var divCntr   = document.createElement("DIV");
   // aktuelle Spaltenbreite merken
   var tdWidths = new Array();
   for (var i = 0; i < this.rows[0].cells.length; i++)
   {
      tdWidths[i] = this.rows[0].cells[i].offsetWidth;
   }
   // Header Anhaengen
   var tbdyHeader = document.createElement("TBODY");
   tableHeader.appendChild(tbdyHeader);
   tbdyHeader.appendChild(this.rows[0].cloneNode(true));
   // Body Reihen anhaengen
   var tbdyBody = document.createElement("TBODY");
   tableBody.appendChild(tbdyBody);
   for (var i = 1; i < this.rows.length; i++)
   {
      var oRow = this.rows[i].cloneNode(true);
      tbdyBody.appendChild(oRow);
   }
   // scrollbar visible | hidden | scroll | auto
   divCntr.style.overflow = "auto";
   if (this.bodyHeight) divCntr.style.height = this.bodyHeight;
   divCntr.appendChild(tableBody);
   // alte Spalten entfernen
   for (var i = this.rows.length; i > 0; i--)
   {
      this.rows[i-1].removeNode(true);
   }
   var tr1 = this.insertRow();
   var td1 = tr1.insertCell();
   var tr2 = this.insertRow();
   var td2 = tr2.insertCell();
   //Ueberschrift Zelle Laden & Hintergund angleichen
   td1.appendChild(tableHeader);
   td1.className=this.headerCSS;
   td2.appendChild(divCntr);
   // Spaltenbreite setzen
   for (var i = 0; i < tdWidths.length - 1; i++)
   {
      tableHeader.rows[0].cells[i].width = tdWidths[i];  
      tableBody.rows[0].cells[i].width   = tdWidths[i];
   }
   tableHeader.style.fontSize    = "100%";
   tableHeader.width             = "100%";
   tableHeader.style.tableLayout = "fixed";
   tableHeader.className         = this.headerCSS ? this.headerCSS : "";
   tableHeader.border = 0;
   tableBody.style.fontSize      = "100%";
   tableBody.width               = "100%";
   tableBody.style.tableLayout   = "fixed";
   tableBody.className           = this.bodyCSS ? this.bodyCSS : "";
   tableBody.border = 0;
   this.cellSpacing = 0;
   this.cellPadding = 0;
}
</SCRIPT> 

Um das Script auch in die ASPX Seite einzubinden, muss eine Style Klasse erzeugt werden die per Behavior zur URL der Script Datei verweist

  <STYLE>
.tableMain { FONT-SIZE: 0.8em; BEHAVIOR: url(scroll.htc); FONT-FAMILY: Verdana }
.tableHeader { BACKGROUND-COLOR: skyBlue }
.tableBody { COLOR: darkblue; BACKGROUND-COLOR:#EEEEEE }
  </STYLE>


Der letzte wesentliche Punkt behinhaltet das Einfügen von Attributen in das Datagrid. Diese Attribute wie headerCSS oder BodyCSS haben für ASP.NET keine Bedeutung. Erst das clientseite Script kann damit was anfangen.

<asp:DataGrid id="DataGrid1" bodyHeight="50" bodyCSS="tableBody" headerCSS="tableHeader" cssclass="tableMain"
    runat="server" AutoGenerateColumns="False"


Am Schluss steht dann das Scrollbare Datagrid.

Und wieder sind wir unserem Browserbasierten Excel einen Schritt näher gekommen. Allerdings funktioniert dieser Code nur im Internet Explorer ab Version 5. Eine portierung für andere Browser ist denkbar.

Die Idee und wesentliche Teile des Codes stammen von einem Englisch sprachigen Artikel eines Paschal L.  


Erfasst am: 01.10.2003 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=893
© Copyright 2003 ppedv AG - http://www.ppedv.de