Avatar billede gulbaek Nybegynder
17. august 2006 - 17:03 Der er 11 kommentarer og
1 løsning

Sæt værdi på variable i UserControl

Har lavet en UserControl kaldet RssReader, den har en variable string rssFeed; mit problem består i hvordan jeg kan tilgå denne variable ude fra. Jeg opretter mine user controls dynamisk fra code behind, dertil bruger jeg nedenstående metode. Men kan simpelthen ikke finde udaf hvordan jeg skal kunne sætte rssFeed variablen når jeg opretter en RssReader user control.

private void createSnapInstance(string id,
                                    string currentDockingContainer,
                                    int currentDockingIndex,
                                    string title,
                                    string usercontrolUrl,
                                    string rssUrl)
    {
        ComponentArt.Web.UI.Snap Snap = new ComponentArt.Web.UI.Snap();
        Snap.ID = id;
        Snap.DockingContainers = "LeftColumn,RightColumn";
        Snap.CurrentDockingContainer = currentDockingContainer;
        Snap.CurrentDockingIndex = currentDockingIndex;
        SnapHeader Header = new SnapHeader();
        Header.Title = title;
        Header.SnapID = id;
        Snap.HeaderTemplate = Header;       
        Snap.ContentTemplate = Page.LoadTemplate(usercontrolUrl);
        if (rssUrl != null)
        {
            ((UserControl_RssReader)Snap.Content.Controls[1]).rssFeed(rssUrl);
        }

        PlaceHolder1.Controls.Add(Snap);
    }

Som koden er nu giver den en fejl i if sætningen med 'Object reference not set to an instance of an object.' gør den også hvis jeg sætter den til 0.

Har også overvejet at oprette UserControllen sætte værdien og kalde Snap.ContentTemplate = minRssReader; men den tager en ITemplate og ved ikke lige hvordan jeg får den lavet om til sådan en.

Håber nogen har et godt forslag.
Avatar billede gulbaek Nybegynder
17. august 2006 - 18:50 #1
Har ladet min UserControl implementere ITemplate på følgende måde
public partial class UserControl_RssReader : System.Web.UI.UserControl, ITemplate

og tilføjet denne metode
public void InstantiateIn(Control container)
{
  //Ved ikke hvad der skal stå i den???
}
og lavet min if sætning om til dette

if (rssUrl != null)
{
      UserControl_RssReader rssReader = new UserControl_RssReader();
      rssReader.Init += delegate { rssReader.rssFeed(rssUrl); };
     
      Snap.ContentTemplate = rssReader;
}
else
{
      Snap.ContentTemplate = Page.LoadTemplate(usercontrolUrl);
}

PlaceHolder1.Controls.Add(Snap);

Det kompiler også fint nu, men der blir ikke kaldt nogle event's på rssReader objectet, som Init og Load. hvilket jeg ikke lige kan forstå
Avatar billede snepnet Nybegynder
17. august 2006 - 22:45 #2
Hvis du bare vil udstille noget tilstand, laver du bare en public property på klassen...
Har du din
private string m_RssFeed;

Laver du en property:
public string RssFeed
{
  get{return m_RssFeed;}
  set{m_RssFeed = value;}
}

Så kan du sætte den som alle andre properties:
<ccc:UserControl_RssReader ... RssFeed="blah" ...

Mvh
Avatar billede snepnet Nybegynder
17. august 2006 - 22:50 #3
Hvis du vil eksekvere kode i de events du nævner - kan du gøre det sådan her:

// for load
protected void Page_Load(object sender, EventArgs e)
{

}

// for init
protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
}

Og mht. det med templaten.... Har du så overhovedet brug for sådan en?

Det giver dig mulighed for at definere indholdet af kontrollen deklerativt - f.eks.:

<ccc:SomeControl ... >
  <TemplateArea>
    det du vil have ind...
  </TemplateArea>
</ccc:SomeControl>

Mvh
Avatar billede gulbaek Nybegynder
17. august 2006 - 23:21 #4
Tvivler på jeg skal bruge templaten til noget, men var bare umiddelbart eneste løsning jeg kunne finde på, så jeg kunne tilføje rssUrl værdien. Desværre kan jeg ikke helt bruge dine eksempler da de ikke er 100% kode behind, hvilket jeg er nødtil at benytte da jeg ikke umiddelbart ved hvor mange RssReader user control jeg får brug for pr. side. Det blir noget der helt er op til den enkelte bruger.

Har siddet og testet lidt, og det er der hvor jeg opretter rssReader objectet i if sætningen det går galt. Hvis jeg i stedet for opretter det på følgende måde, virker det fint, jeg har bare ikke mulighed for at sætte rssFeed variablen.

  Snap.ContentTemplate = Page.LoadTemplate(usercontrolUrl);  //usercontrolUrl link til rssReader usercontrol.

Og lige et gæt på hvordan jeg tror løsningen skal se ud, men som desværre ikke virker

  ((UserControl_RssReader)Snap.ContentTemplate).rssFeed("Filmz");

Og lige et link til hvor det snap objekt kommer fra
http://www.componentart.com/demos/snap/programming/runtime_instantiation/WebForm1.aspx Det er samme eksempel jeg har taget udgangspunkt i.
Avatar billede snepnet Nybegynder
17. august 2006 - 23:34 #5
Du kan sætte det deklerativt som programmatisk:
<ccc:SomeUserControl id="controlInstance" SomeProperty="blah" ...

Svarer til:
SomeUserControl controlInstance = Page.LoadTemplate(<path>) as SomeUserControl;
controlInstance.SomeProperty = "blah";

Mvh
Avatar billede gulbaek Nybegynder
17. august 2006 - 23:52 #6
Den kode du har skrevet der giver underlig nok en Object reference not set to an instance of an object. Har været ved at kigge på om det var muligt med en FindControl, men den finder umiddelbart ikke noget

((UserControl_RssReader)Snap.FindControl(id)).rssFeed(rssUrl);

Tror det ender med jeg bliver nødtil at kontakte Componentart's support.
Avatar billede snepnet Nybegynder
18. august 2006 - 00:02 #7
På hvilken linie får du fejlen?
(Debug ned igennem med F11 - ikke F10)
Mvh
Avatar billede gulbaek Nybegynder
18. august 2006 - 00:10 #8
Fejlen opstår ved linjen  controlInstance.SomeProperty = "blah, jeg har dog lavet den om til en public method  så det blir controlInstance.SomeProperty("blah") men det er lige meget nu, har fået løst det.

Det lykkes mig endelig at finde udaf hvor præcist min user control blev gemt i Snap :-)
((UserControl_RssReader)Snap.Controls[1].Controls[0].Controls[0]).rssFeed(rssUrl);

Men smid et svar, så du kan få lidt point som tak for hjælpen :-)
Avatar billede snepnet Nybegynder
18. august 2006 - 00:32 #9
Kender ikke snap - men hvis du selv har hånd i hanke med den klasse (Snap) - kan du jo sætte din egent usercontrol som pulblic property på den.
Mvh
Avatar billede gulbaek Nybegynder
18. august 2006 - 08:38 #10
Har desværre ikke adgang til kilde koden af Snap :-( Men takker for hjælpen ihvertfald
Avatar billede snepnet Nybegynder
18. august 2006 - 09:02 #11
http://www.aisto.com/roeder/dotnet/
Så har du en god mulighed for at finde ud af hvordan tingene foregår, selvom du ikke umiddelbart har kildekoden.
Mvh
Avatar billede daxiez Nybegynder
27. februar 2009 - 00:10 #12
Dit problem er at du SKAL oprette dine controls og events inde i InstantiateIn. Hvis du ikke gør det så bliver dine events ikke oprette på det rigtige tidspunkt i exekverings rækkefølgen. Dette er selvfølge hvis du VIL bruge Itemplate.
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