Avatar billede claus_n_p Nybegynder
24. marts 2005 - 06:44 Der er 5 kommentarer og
1 løsning

Oprettelse af metode i WebCustomControl

Hej

Når jeg tilføjer en WebCustomControl klasse til mit projekt, kommer den med en default metode:
        Protected override void Render(HtmlTextWriter output){
            output.Write(text); //som referer til en
                                //default get/set metode
        }

Til denne metode skal jeg tilføje et kald til min egen metode, som kalder en hashtabel med navne på labels, buttons mm. Metoden skal så påklistre de navne på de aktuelle labels mm.

Spørgsmålet er så: Hvordan aktiver jeg min metode i metoden Render.

Metoden har jeg lagt i klassen(WebCustomControl) og prøvet med almindeligt metode kald, ingen resultat.

En anden ting, min metode:
          protected void SetCaption(ControlCollection ctrls, Hashtable messages){}

Sammenligner den valgte sides controls id med key id i hashtabellen og hvis der er sammenfald indsættes værdien som eks Label1.Text = værdi.
Hashtabellen ligger, via global.asax, globalt - fuld adgang.

Ovennævnte metode fungerer udemærket, når jeg ligger den på den enkelte side - men det ville være rart hvis den kun ligger et sted og starter automatisk.
Avatar billede snepnet Nybegynder
24. marts 2005 - 11:09 #1
hej claus :o)

rendermetoden kaldes automatisk af frameworket, og du kan sagtens kalde andre metoder fra den :

protected override void Render(HtmlTextWriter output)
{
  OtherMethod(output);
}

private void OtherMethod(HtmlTextWriter output)
{
  // hvad du nu vil skrive
}

Jeg kan dog ikke helt se værdien af det....

Hvis den kontrol du vil lave skal ende med at rendere diverse andre kontroller, som du vil håndtere events fra mv. kan du - med et lille performancehit, men en nemmere måde at lave kontrollen på - overskrive den metode der hedder
CreateChildControls();

// her et lille eksempel hvor der indsættes en tekstboks og en knap :
protected override void CreateChildControls()
{
  TextBox tb = new TextBox();
  Button btn = new Button();
  this.Controls.Add(tb);
  this.Controls.Add(btn);   
  ChildControlsCreated = true;
  base.CreateChildControls ();
}

Hvis du ønsker at håndtere f.eks. et click-event på knappen kan du så :
(her også vist hvordan du så kalder din egen metode)

protected override void CreateChildControls()
{
  TextBox tb = new TextBox();
  Button btn = new Button();
  btn.Click += new System.EventHandler(btn_Click);
  this.Controls.Add(tb);
  this.Controls.Add(btn);   
  SetCaption(this.Controls, HashTable messages);
  ChildControlsCreated = true; 
  base.CreateChildControls ();
}

og så en handler :
protected void btn_Click(object sender, EventArgs e)
{
  // hvad der nu skal ske når der klikkes på knappen
}

Hvis ovenstående skal fungere skal du implementere det interface der hedder INamingContainer på din kontrol.... Altså der hvor klassen starter f.eks.:

public class SomeCustomControl : Control, INamingContainer

Håber jeg ikke fuldstændig har misforstået hvad det er du vil, men hvis det er tilfældet må du jo lige give mig et vink :o)

Mvh
Avatar billede claus_n_p Nybegynder
24. marts 2005 - 14:51 #2
Hej snepnet

Det er en lille smule kompliceret, så du får lige historien fra toppen af.

Jeg er studerende og har i forbindelse med studiet fået muligheden for at skrive et projekt for et kinesisk firma - i Kina. De taler ikke særlig godt engelsk, det meste kommunikation foregår med fagter, gæt og til dels "prototyper".

Som sagt, skal jeg lave en hjemmeside, der kan styre udvikling af projekter og mødeaktiviteter og lagre dette på en db. Da firmaet har samarbejdspartner/kunder i Japan og forventer at få det i USA, skal siden kunne skifte mellem tre sprog.

Det er dette skift mellem sprog, jeg sidder og pusler med nu. Jeg har lavet en metode som løber control collection igennem på en side og sammenligner controlid med en hashtabel, og ved korrekt sammenligning findes den text der skal sættes på en label - eller anden control på siden.

Denne metode fungerer hvis man ligger på den enkelte side(metoden kommer længere nede). Kineserne insisterer dog på at den skal ligge globalt og jeg fik foreslået at man lagde den som en statisk metode : Klasse.metode - og foreslog dette for kineserne. De vendte tilbage og sagde de ville have den i WebCustomControl, således at den blev aktiveret automatisk ved sideskift - og jeg mener ikke, at de er til at rokke i den retning.

Og lige for en ordens skyld - min baggrund er Java. C# kender jeg fra et halvårskursus, hvor jeg ikke var tilmeldt - men pga. interesse fik lov at sidde med til nogle af lektionerne. ASP har jeg haft to måneders (ikke så god) undervisning i.

Lidt kode:

        protected void SetCaption(ControlCollection ctrls, Hashtable messages)
        {
            foreach (Control ctrl in ctrls)
            {
                SetCaption(ctrl.Controls, messages);
               
                string id = ctrl.ID;
                if(id == null || id == "")
                continue;

                string caption = (string)messages[id];
                if(caption == null)
                    continue;

                switch(ctrl.GetType().ToString())
                {
                    case "System.Web.UI.WebControls.Label":
                        Label lbl = (Label)ctrl;
                        lbl.Text = caption;
                        break;
                    case "System.Web.UI.WebControls.Button":
                        Button btn = (Button)ctrl;
                        btn.Text = caption;
                        break;
                }
            }
        }

Som du kan se, løber den controls og hashtabel igennem - finder den rigtige betegnelse(navngivning af label) og sender den i en switch. Switch er ikke fuld udbygget - kun til prøvebrug.

Jeg kan godt følge det du skriver om metoden "Render", men min metode giver du en parameter (HtmlTextWriter output) - kan jeg så bare tilføje mine egne parameter, altså
metode(HtmlTextWriter output, ControlCollection ctrls, Hashtable messages). Vil det fungerer?

En ordentlig mundfuld, men jeg håber at den gav et lidt bedre indblik i problemet - hvis ikke, spørg endeligt. Jeg er meget opsat på at få løst problemet.

For god ordens skyld vil jeg på forhånd undskylde svartider. Til dels er vi 7 timer foran og til dels har jeg en 100mbps der, når den er på toppen svinger mellem 3-4 kb i download.

Mvh
Avatar billede snepnet Nybegynder
24. marts 2005 - 16:37 #3
det ser lidt tvivlsomt ud det du har aftalt der.
har du en messangerkonto eller lignende jeg kan kontakte dig på ?
(email, messanger, skype - eller hvilken oplysning du nu har det bedste med at lægge herud... jeg skal nok kontakte dig på den du angiver)
mvh
Avatar billede claus_n_p Nybegynder
25. marts 2005 - 00:41 #4
Hej Snerpnet

Du kan kontakte mig på denne her: clausinchina@hotmail.com - så får du de andre.

mvh
Avatar billede snepnet Nybegynder
25. marts 2005 - 18:18 #5
using System;
using System.Collections;
using System.Web.UI;

namespace Demo
{
    public class LocalizationBase : Page
    {       
        protected override void Render(HtmlTextWriter writer)
        {
            if(UseLocalizer)
                SetCaption(...);
            base.Render (writer);
        }

        protected virtual void SetCaption()
        {
            //
        }
    }
}

mvh
Avatar billede snepnet Nybegynder
25. marts 2005 - 18:19 #6
(ups... havde lige lidt tilbage fra UseLocalizer)

using System;
using System.Collections;
using System.Web.UI;

namespace Demo
{
    public class LocalizationBase : Page
    {       
        protected override void Render(HtmlTextWriter writer)
        {
            SetCaption(...);
            base.Render (writer);
        }

        protected virtual void SetCaption()
        {
            //
        }
    }
}

mvh
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