2010-02-05 13 views
5

Mam następującą funkcję statycznego w C#Jak przypisać wartość z C# metody statycznej na etykiecie

public static string Greet(string name) 
    { 
     string greeting = "welcome "; 

     // is it possible to pass this value to a label outside this static method? 
     string concat = string.Concat(greeting, name); 

     //error 
     Label1.text = concat; 

     //I want to return only the name 
     return name; 
    } 

Jak widać w komentarzach, chcę zachować tylko nazwę jako wartość zwracana jednak chcę być w stanie pobrać wartość zmiennej concat, aby przypisać ją do etykiety, ale kiedy próbuję odmówić kompilator, czy można to zrobić? Czy jest w pobliżu praca?

Dziękuję.

+0

Dlaczego funkcja stała się statyczna? Oczywistym rozwiązaniem jest uczynienie go nie statycznym. – Foole

+0

Nie wspominając, że wydaje się dziwne, aby zwrócić parametr w tym przypadku. –

+1

Jest statyczny, ponieważ jest udekorowany jako [WebMethod], a następnie wywoływany przez Ajax, zwracana wartość jest przekazywana do Ajax, nadal potrzebuję użyć zmiennej concat w kodzie z tyłu. - dziękuję – tika

Odpowiedz

4

Jeśli metoda musi być statyczny z jakiegoś powodu, główny podejście tutaj byłoby przekazać wszelkie wymagane stan do metodę - czyli dodać parametr do metody, która jest albo na etykiecie lub (lepiej) niektóre wpisany wrapper z właściwością ustawianego jak .Greeting:

public static string Greet(string name, YourType whatever) 
{ 
    string greeting = "welcome "; 

    whatever.Greeting = string.Concat(greeting, name); 

    return name; 
} 

(gdzie YourType może być Twoja kontrola, czy może być interfejs umożliwiający ponowne użycie)

Co do not chcę zrobić to użyć stanu statycznego lub zdarzeń - bardzo łatwo dostać wycieki pamięci itp. W ten sposób.


Na przykład:

public static string Greet(string name, IGreetable whatever) 
{ 
    string greeting = "welcome "; 

    whatever.Greeting = string.Concat(greeting, name); 

    return name; 
} 
public interface IGreetable { 
    string Greeting {get;set;} 
} 
public class MyForm : Form, IGreetable { 
    // snip some designer code 

    public string Greeting { 
     get { return helloLabel.Text;} 
     set { helloLabel.Text = value;} 
    } 

    public void SayHello() { 
     Greet("Fred", this); 
    } 
} 
+0

Dziękuję Marc, to naprawdę ma sens. Próbuję to. :) – tika

+0

Cześć Marc, dziękuję. Ok Zrobię opakowanie i mogę przypisać mu wartość: public class MyType { prywatny ciąg x; public string Powitanie { get {return x; } zestaw {x = wartość; } } } Jednak wciąż mam trudności z ustaleniem, jak przypisać właściwość opakowania do etykiety zaraz po wykonaniu metody Greet. z góry dzięki. – tika

+0

Wielkie dzięki, Marc, działa! Cieszę się z twojej odpowiedzi. – tika

4

Albo niestatyczny:

public string Greet(string name) 
{ 
    const string greeting = "welcome "; 
    string concat = string.Concat(greeting, name); 
    Label1.Text = concat; 
    return name; 
} 

Albo jeszcze statyczne przechodząc etykietę jak Greet("John", Label1):

public static string Greet(string name, Label label) 
{ 
    const string greeting = "welcome "; 
    string concat = string.Concat(greeting, name); 
    label.Text = concat; 
    return name; 
} 

ale nie wiem, dlaczego trzeba zwrócić nazwę w każdym przypadku ... Jeśli miał to podczas wywoływania funkcji, masz ją już w zakresie, do którego wrócisz. Przykład:

var name = "John"; 
Greet(name); 
//can still call name here directly 
+0

dziękuję Nick, To tylko uproszczony przykład z samą nazwą. Powód jest statyczny, ponieważ jest ozdobiony atrybutem [WebMethod]. Nie wiem jednak, czy istnieje sposób na uzyskanie dostępu do metody strony z Ajax bez deklarowania jej jako statycznej. – tika

+0

@tika - Ah, w tym przypadku tak, to musi być statyczne. –

+0

Cześć Nick, próbuję tego przykładu, ale kompilator narzeka, że ​​plik ystem.Web.UI.WebControls.Label "nie zawiera definicji" tekstu ". Przepraszam, jestem taki noob, właśnie się uczę. – tika

0

Problemem jest to, że starają się wystąpienia klasy zmiennej z metody statycznej.

0

Może jestem brakuje punktu, ale nie można po prostu zrobić:

public static string Greet(string name) 
{ 
    return string.Concat("Welcome ", name); 
} 

następnie użyć go lubię: Metody

string name = "John"; 
label1.Text = Greet(name); 

sieci nie muszą być statyczne.

+1

Cześć Nismoto, Masz rację, ale to jest inny scenariusz, chciałem być w stanie uzyskać informacje bez użycia zwracanej wartości, zwracana wartość jest już używana. Próbowałem wywoływać metody stron w ASP.NET 3.5 z Ajax i nie wymagają one statycznego, jednak w .NET 2.0 po prostu nie działają, chyba że są zadeklarowane jako statyczne. ale myślę, że będzie to kolejne osobne pytanie. – tika

Powiązane problemy