Avatar billede davidfossil Nybegynder
19. april 2004 - 18:17 Der er 16 kommentarer og
1 løsning

DataGrid UDEN formatering

Er der nogen der ved om det er muligt at have sig et datagrid, der udelukkende renderer som en tabel - dvs. uden formatering.

Jeg ønsker at min kode skal se sådan her ud:
<table id="minID">

i stedet for
<table cellspacing="0" border="0" id="minID" style="border-style:None;border-collapse:collapse;">

Er det muligt uden alt for meget ballade?
Avatar billede burningice Nybegynder
19. april 2004 - 20:02 #1
mig bekendt er den eneste mulighed at subclasse datagriddet og overskrive render-metoden... har selv har bøvl med andre datakontroller der ikke ville makke ret ;)
Avatar billede davidfossil Nybegynder
19. april 2004 - 21:16 #2
hmm, hvis nogen kan give en smule hjælp til hvordan jeg overskriver den lede metode ville jeg blive glad.
måske er det i virkeligheden "RenderBeginTag" metoden der skal omskrives til bare at lave en <table> ...?
Avatar billede burningice Nybegynder
19. april 2004 - 22:17 #3
først så sublclasser du datagrid'et:

public class MitGrid : DatGrid {
  public MitGrid() : base()
}

dernæst overskriver du RenderBeginTag:

public overwrite virtual void RenderBeginTag(HtmlTextWriter writer) {
    writer.WriteLine("<table id=\"+ this.ClientId +">");
}
Avatar billede davidfossil Nybegynder
20. april 2004 - 10:09 #4
Det ser ikke ud til at gøre nogen forskel hvad jeg skriver i RenderBeginTag, men derimod giver en override af Render metoden resultater.
Problemet er så bare at den overskriver _alt_ i metoden og at man således skal skrive alting om igen, hvilket godt kunne se ret uoverskueligt ud... :(

Nogle andre forslag?
Hvad er idéen med den din linje "public MitGrid() : base()" ?
Avatar billede burningice Nybegynder
20. april 2004 - 10:28 #5
når du sublclasser, så skal man sørge for at kalde metoderne i den klasse man arver fra, med mindre man vil overtage HELE dens funktion. Det kan være at RenderBeginTag ikke bliver kaldet... prøv følgende:

public overwrite virtual void RenderBeginTag(HtmlTextWriter writer) {
  writer.WriteLine("<table id=\"+ this.ClientId +">");
}

public overwrite virtual void Render(HtmlTextWriter writer) {
  this.RenderBeginTag(writer);
  base.Render(writer);
}
Avatar billede davidfossil Nybegynder
20. april 2004 - 11:54 #6
det bragte mig en smule nærmere, men løste ikke problemet.

base.Render(writer) vil stadig returnere den forkerte linje, så resultatet bliver:

<table id="minID">
<table cellspacing="0" border="0" id="minID" style="border-style:None;border-collapse:collapse;">

Altså begge dele ... =\
Avatar billede burningice Nybegynder
20. april 2004 - 12:09 #7
jeg finder lige den databel-sublclass jeg lavede frem.. så må vi se hvad jeg lavede der :)
Avatar billede burningice Nybegynder
20. april 2004 - 14:49 #8
public override void RenderBeginTag(HtmlTextWriter writer)
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);

            writer.RenderBeginTag(HtmlTextWriterTag.Table);
        }

Det er hvad jeg har stående i min DataGrid-klasse... og det virker
Avatar billede davidfossil Nybegynder
20. april 2004 - 15:41 #9
den del ser også ud til at fungere fint her.
men det giver stadig samme problem - at begge <table> tags bliver renderet.

hvad har du stående i Render metoden?

kan du evt. smide hele klassen, så ville jeg blive meget glad. :)
Avatar billede burningice Nybegynder
20. april 2004 - 16:21 #10
jeg har ikke noget i render-metoden
Avatar billede davidfossil Nybegynder
20. april 2004 - 16:36 #11
Ok, du mener altså at det burde virke med denne kode:
public class PlainDataGrid : DataGrid
{
    public override void RenderBeginTag(HtmlTextWriter writer)
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);
        writer.RenderBeginTag(HtmlTextWriterTag.Table);
    }
}

eller glemmer jeg et eller andet?
det dur i hvert fald ikke :(
Avatar billede davidfossil Nybegynder
22. april 2004 - 17:06 #12
cyberfessor : er du forsvundet ? :(
Avatar billede burningice Nybegynder
23. april 2004 - 11:36 #13
nej... undskyld... jeg fandt lige ud af det faktisk var ved en DataTable jeg havde lavet trikket... er dog ved at undersøge hvordan man krejler det for et DataGrid
Avatar billede burningice Nybegynder
23. april 2004 - 12:27 #14
prøv den her:

      public class MitGrid : System.Web.UI.WebControls.DataGrid {
          public override void RenderBeginTag(HtmlTextWriter writer) {
         
          writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);
              writer.RenderBeginTag(HtmlTextWriterTag.Table);
 
      }

          protected override void Render(HtmlTextWriter writer) {
                       
        StringWriter sBuffer = new StringWriter();
        HtmlTextWriter buffer = new HtmlTextWriter(sBuffer);
        base.Render(buffer);
        string html = sBuffer.ToString();

                sBuffer = new StringWriter();
        buffer = new HtmlTextWriter(sBuffer);
        this.RenderBeginTag(buffer);
                string startTag = sBuffer.ToString();

                string[] lines = html.Split('\n');
                lines[0] = startTag;

                foreach(string line in lines) {
                  writer.Write(line);
                }
          }
      }

Ja, det er en rigtig shitty løsning, men kan ikke lige komme på andet
Avatar billede davidfossil Nybegynder
23. april 2004 - 19:38 #15
jamen det dur jo, nu skal jeg bare lige læse koden igennem og fatte det hele :)

mange tak for hjælpen, kunne du ikke lige skrive et svar så jeg kan begave dig ;)
Avatar billede burningice Nybegynder
23. april 2004 - 20:10 #16
det er ikke det helt store...

1) man renderer datagriddet til en lokal HtmlWriter-buffer
2) dernæst renderer man det ønskede start-tag (RenderBeginTag) til endnu en lokal buffer
3) erstatter den første linje i det renderede datagrid (som jo er <table> tagget) med det nye start-tag ved hjælp af split
4) udskriv hver enkelt linje til writeren som indeholder det output der bliver sendt til clienten

det er især punkt 3 som splitter hele datagriddets html op i x antal linjer, og punkt fires foreach der er resource-krævende. Man kan evt. lave noget regexp eller replace for at få replacet det oprindelige start-tag med det ønskede, men det må man sidde og lege lidt med
Avatar billede burningice Nybegynder
23. april 2004 - 20:10 #17
.. og det var det svar :)
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