Avatar billede wired Nybegynder
14. september 2004 - 01:08 Der er 4 kommentarer og
1 løsning

tbody i asp.net

Mit spørgsmål er simpelt? Men er svaret også?

Hvordan tilføjer jeg dynamisk en tbody i en tabel

Alt skal være dynamisk/vb.net programmeret
Avatar billede snepnet Nybegynder
14. september 2004 - 18:17 #1
hej wired... det er den ikke sådan noget rigtig entydigt svar på tror jeg. du kan gå mange veje med den der.

du får lige et (synes jeg da selv) munter forslag her :o)
(det er lidt ude i hampen, men du kan muligvis bruge det... du kan jo se på det).

Det er ikke alle typer af kontroller du bare kan klaske ind i en Table, men en TableRow kan man altid slippe afsted med.... Jeg har derfor subclasset en TableRow (så det kan accepteres at indsætte den i tabellen dynamisk), og sørger for at denne specialisering så kan indsætte flere rows, indkapslet i <TBODY></TBODY>


Public Class TableBody
Inherits TableRow
Private rows As TableRow

Public Sub New(ByVal rows() As TableRow)
  Me.rows = rows
End Sub

Public Overloads Overrides Sub RenderBeginTag(ByVal writer As HtmlTextWriter)
  writer.WriteFullBeginTag("TBODY")
End Sub

Public Overloads Overrides Sub RenderEndTag(ByVal writer As HtmlTextWriter)
  writer.WriteEndTag("TBODY")
End Sub

Protected Overloads Overrides Sub Render(ByVal writer As HtmlTextWriter)
  Me.RenderBeginTag(writer)
  For Each trow As TableRow In rows
    trow.RenderControl(writer)
  Next
  Me.RenderEndTag(writer)
End Sub
End Class

// et lille eksempel på brug :

// først en almindelig række
Dim table As Table = New Table ()
Dim trow As TableRow = New TableRow ()
Dim tcell As TableCell = Nothing
tcell = New TableCell ()
tcell.Text = "hej"
trow.Cells.Add(tcell)
tcell = New TableCell ()
tcell.Text = "med"
trow.Cells.Add(tcell)
tcell = New TableCell ()
tcell.Text = "dig"
trow.Cells.Add(tcell)
table.Rows.Add(trow)

// så laver vi en stak rækker der skal indpakkes i tbody
Dim rows(5) As TableRow
Dim i As Integer = 0
While i < rows.Length
rows(i) = New TableRow ()
Dim j As Integer = 0
While j < 3
  tcell = New TableCell ()
  tcell.Text = "*"
  rows(i).Cells.Add(tcell)
  j += 1
End While
i += 1
End While

// her foretages indpakning... i og med at den speciell "række" bruges
table.Controls.Add(New TableBody (rows))

// og så en almindelig række til at slutte af med
trow = New TableRow ()
tcell = Nothing
tcell = New TableCell ()
tcell.Text = "hej"
trow.Cells.Add(tcell)
tcell = New TableCell ()
tcell.Text = "med"
trow.Cells.Add(tcell)
tcell = New TableCell ()
tcell.Text = "dig"
trow.Cells.Add(tcell)
table.Rows.Add(trow)

// og ind med tabellen - Form1 er serverformen på siden
Form1.Controls.Add(table)

mvh
Avatar billede wired Nybegynder
14. september 2004 - 22:28 #2
Jo da. ;-)

Det løser problemet, og så lærte jeg også lidt om hvordan man laver nye controls ved at arve fra gamle. Ganske oplysende.

Det er ikke fordi jeg absolut skal bruge tbody, men jeg kan bare ikke se hvordan jeg kan sætte style.display til hhv. 'block' og 'none' for flere rækker uden at bruge tbody.

Måske du kender en anden og evt. nemmere løsning på dette?
Avatar billede snepnet Nybegynder
16. september 2004 - 08:39 #3
Hov undskyld wired - jeg synes egentlig jeg har skrevet tilbage her ?!?!

Nå - men det er vel sådan set en fin nok løsning at fikse det sådan... Kan du bruge et par ekstra trix ?
(det er lidt omkring tilskrivning af attributter + udskrivning af scripts til siden mv).

// ny kontrol... nu med folde-ud-folde-ind trix :o)

public class TableBody : TableRow
{
    private TableRow[] rows;

    protected string Script
    {
        get
        {
            return @"
            <script language=""javascript"">
            function ShowHide(id)
            {
                if (document.getElementById(id).style.visibility=='hidden')
                {
                    document.getElementById(id).style.visibility='visible';       
                    document.getElementById(id).style.display='block';
                }
                else
                {
                    document.getElementById(id).style.visibility='hidden';   
                    document.getElementById(id).style.display='none';
                }
            }
            </script>";
        }
    }

    public TableBody(TableRow[] rows)
    {
        this.rows = rows;
        this.BackColor = Color.LightBlue;
    }

    public override void RenderBeginTag(HtmlTextWriter writer)
    {   
        writer.AddAttribute(HtmlTextWriterAttribute.Id, this.UniqueID);
        writer.RenderBeginTag(HtmlTextWriterTag.Tbody);;
    }

    public override void RenderEndTag(HtmlTextWriter writer)
    {           
        writer.RenderEndTag();
    }

    protected override void OnPreRender(EventArgs e)
    {       
        if(!this.Page.IsStartupScriptRegistered("ShowHide"))
            this.Page.RegisterStartupScript("ShowHide",Script);
        base.OnPreRender (e);
    }


    protected override void Render(HtmlTextWriter writer)
    {               
        writer.AddAttribute("onclick","ShowHide('"+this.UniqueID+"');");
        writer.AddStyleAttribute("cursor","hand");

        CreateShowHideRow(rows[0].Cells.Count).RenderControl(writer);
       
        this.RenderBeginTag(writer);
       
        foreach(TableRow trow in rows)
        {
            trow.RenderControl(writer);
        }
       
        this.RenderEndTag(writer);
    }

    private TableRow CreateShowHideRow(int colSpan)
    {
        TableRow trow = new TableRow();
        TableCell tcell = new TableCell();
        tcell.ColumnSpan = colSpan;
        tcell.BackColor = Color.LightBlue;
        tcell.Text = "Tryk her for at vise/gemme";
        trow.Cells.Add(tcell);
        return trow;
    }
}

Mvh
Avatar billede wired Nybegynder
16. september 2004 - 15:58 #4
Hvad gør netscape brugere de har ikke tbody?

Nåe... Men mange tak for hjælpen. Det løser afgjort mit problem :-)
Sender du lige et svar?
Avatar billede snepnet Nybegynder
16. september 2004 - 16:02 #5
de pakker det nok ind i noget layer-væsen istedet vil jeg tro (det kunne du sådan set også gøre).
Men... et svar skal du få :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester