[C#] aanroep variabele alleen in functie

Pagina: 1
Acties:

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
Ik denk dat de titel een beetje vaag is, dus ik zal het wat nader uitleggen.

Ik ben momenteel bezig om een webpart in Sharepoint te schrijven, specifiek met de SPWeb class. Nu gaat het er niet zo zeer om welke code ik precies gebruik, maar meer om de locatie waar ik de code neerzet.

Dit is de code die wel werkt:
C#:
1
2
3
4
5
6
7
8
  public class ChangePasswordWebPart
  {
    public void _SubmitButton_click( object sender, EventArgs e )
    {
        SPWeb site = SPControl.GetContextWeb( Context );
        string currentUser = site.CurrentUser.Name.ToString();  
    }
  }

Maar ik heb bijna een dag vern**kt omdat ik de code op een andere locatie uitprobeerde:
C#:
1
2
3
4
5
6
7
8
9
10
  public class ChangePasswordWebPart
  {
    SPWeb site = SPControl.GetContextWeb( Context );
    string currentUser = site.CurrentUser.Name.ToString();  

    public void _SubmitButton_click( object sender, EventArgs e )
    {
            ...
    }
  }


Ik krijg deze foutmelding:
code:
1
An object reference is required for the nonstatic field, method, or property  System.Web.UI.Control.Context

Nu vind de compiler dus twee Context objecten, en weet hij niet welke hij moet gebruiken. Nu moet ik dus eigenlijk zelf met een goede referentie komen, maar ik zou niet weten welke.

normaliter zou ik zeggen:
C#:
1
System.Web.HttpContext.Context


Maar dit werkt niet. En ik snap ook niet waarom de compiler wel het juiste object vindt als ik de code in de functie zet.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 30-04 15:39

pjvandesande

GC.Collect(head);

Als je er nou even properties van maakt?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class ChangePasswordWebPart 
{ 
    protected SPWeb Site
    {
        get
        {
            return SPControl.GetContextWeb( Context );
        }
    }
    
    protected string CurrentUser
    {
        get
        {
            return site.CurrentUser.Name.ToString();
        }
    }
    

    public void _SubmitButton_click( object sender, EventArgs e ) 
    { 
            ... 
    } 
}

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
idd wat questa zegt lijkt me logisch. Waarschijnlijk is je Context nog niet gezet op het moment dat je WebPart class aangemaakt wordt of iets dergelijks.
Je zou het eventueel met een combinatie van property private var kunnen doen mocht GetContextWeb een zware method zijn ( Lijkt me niet overigens )
C#:
1
2
3
4
5
6
7
8
9
10
private SPWeb _site;
protected SPWeb Site
{
    get
    {
        if( _site == null )
            _site = SPControl.GetContextWeb( Context );
        return _site;
    }
}

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
questa schreef op donderdag 15 september 2005 @ 11:35:
Als je er nou even properties van maakt?
De code werkt al. Ik wil alleen graag weten hoe ik het object met de volledige referentie kan aanroepen, en hoe de compiler wel het juiste object gebruikt als ik de code in een functie zet.
rwb schreef op donderdag 15 september 2005 @ 11:41:
idd wat questa zegt lijkt me logisch. Waarschijnlijk is je Context nog niet gezet op het moment dat je WebPart class aangemaakt wordt of iets dergelijks.
het is een compiler-error, en geen runtime error

[ Voor 32% gewijzigd door CaptBiele op 15-09-2005 11:45 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat komt waarschijnlijk omdat je in een Field initializer geen Non-Static fields aan kan spreken. Dan zou je de waarde in de constructor moeten assignen ( Dan is de base class al geinitializeerd ). Er is bij het initializeren namenlijk nog geen instance waar hij de property van kan opvragen

[ Voor 10% gewijzigd door Woy op 15-09-2005 11:51 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
rwb schreef op donderdag 15 september 2005 @ 11:50:
Dat komt waarschijnlijk omdat je in een Field initializer geen Non-Static fields aan kan spreken. Dan zou je de waarde in de constructor moeten zetten. Er is bij het initializeren namenlijk nog geen instance waar hij de property van kan opvragen
Volgens mij is dat precies de juiste uitleg. Ik wist niet dat ik bij field initalizers geen non-static fields mocht aanspreken. En dat de base classe geinitialiseerd moest zijn.. klinkt logisch :)

[ Voor 13% gewijzigd door CaptBiele op 15-09-2005 11:56 ]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 30-04 15:39

pjvandesande

GC.Collect(head);

Initialize dan gewoon in je ctor:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ChangePasswordWebPart 
{ 
    private SPWeb _site;
    private string _currentUser;
    
    public ChangePasswordWebPart
    {
        _site = SPControl.GetContextWeb( Context );
        _currentUser = site.CurrentUser.Name.ToString();
    }

    public void _SubmitButton_click( object sender, EventArgs e ) 
    { 
        ...
    } 
}

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
De field initializers worden voor de constructor uitgevoerd. Er is op dat moment nog geen "this" dus kan je daar ook geen property of methode van aanroepen. De constructor moet deze waardes mischien nog wel initializeren namenlijk

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
rwb schreef op donderdag 15 september 2005 @ 11:55:
De field initializers worden voor de constructor uitgevoerd. Er is op dat moment nog geen "this" dus kan je daar ook geen property of methode van aanroepen. De constructor moet deze waardes mischien nog wel initializeren namenlijk
Maar alle classen worden dan geinitialiseerd? omdat Context uit een andere classe komt....en het geen eigen variabele is...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Context komt uit de base class. Van de base class wordt door de constructor automatisch de default base constructor aangeroepen als je dat niet expliciet specificeert

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class A
{
    private HttpContext _context;
    public A()
    {
        //Vul _context hier
    }

    protected HttpContext Context
    {
        get
        {
            return _context;
        }
    }
}
class B : A
{
    object o; //Hier kan je Context nog niet aanroepen want is nog niet geinitializeerd
    public B() : base()
    {
        o = Context;//Hier is Context al geinitialzeerd
    }
}

dat de base constructor aangeroepen wordt gebeurt ook automatisch als je dat zelf niet doet

[edit]
Ik zie in je voorbeeld dat je class niet erft van WebPart of iets dergelijks. Ik ga er vanuit dat je dat hier vergeten bent om te vermelden. Anders kan je compiler nooit weten waar Context vandaan moet komen.

[ Voor 47% gewijzigd door Woy op 15-09-2005 12:11 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
rwb schreef op donderdag 15 september 2005 @ 12:06:
Ik zie in je voorbeeld dat je class niet erft van WebPart of iets dergelijks. Ik ga er vanuit dat je dat hier vergeten bent om te vermelden. Anders kan je compiler nooit weten waar Context vandaan moet komen.
Ik heb geprobeerd om zo veel mogelijk irrelevante code weg te laten. Maar dat staat wel in mijn code ja :)

Ok, het is duidelijk nu. Hartstikke bedankt voor de uitleg rwb en questa! _/-\o_
Pagina: 1