Korzystam w aplikacji z wątków i timera i chcę zmieniać tekst w labelach, textboxach itd. Wszystko ok ale dla każdego textboxa, labela i innych mam różne funkcje.
Czy nie da się zrobić tak że będę miał jedną funkcję i następnie jakoś przekazać kontrolkę przez parametr? Bo można zrobić obejście (chociaż nie wiem czy zadziała), dać zmienną Control, dać jedną funkcję, przed wywołaniem funkcji przypisywać do zmiennej Control jakiś label, textBoxt a następnie zmieniać w tej funkcji wartość tekstową tej kontrolki. Ale czy można to zrobić w ten sposób żeby przekazać przez parametr? Mi podkreśla linijkę z new Action jeśli dodam parametr.
Pewnie, że można. Tylko nie każdej kontrolce można ustawić .Text Ja bym dorzucił proste zabezpieczenie, żeby przypadkiem nie próbować wrzucić tekstu do np. ProgressBara.
public void SetText(Control control, String text)
{
if (control is Label || control is TextBox)
control.Text = text;
}
private void ChangeText(string text, Control c)
{
if (c.InvokeRequired)
Invoke(new Action(ChangeText), new object[] { text, c });
else
c.Text = text;
}
A widzisz, ja dopisywałem parametr i ‘c’ w nawiasie klamrowym obok text ale już nie pomyślałem o nawiasie ostrym żeby dopisać typ. Dzięki
:edit:
Wczoraj jak odpisywałem nie miałem już dostępu do projektu, sprawdzam to teraz i niestety nie działa. Wyświetla:
Using the generic type System.Action requires 1 type arguments.
Komunikat mówi sam za siebie. Chyba jednak będzie trzeba próbować obejściami ze zmienną globalną lub zrobić nową klasę z polami typu string i Control:
public class SetTextClass
{
public string txt;
public Control c;
public SetTextClass(string t, Control con)
{
txt = t;
c = con;
}
}
private void ChangeText(SetTextClass variable)
{
if (c.InvokeRequired)
Invoke(new Action(ChangeText), new object[] {SetTextClass});
else
variable.c.Text = variable.txt;
}
ChangeText(new SetTextClass(newText,some_control));
To by wszystko wyjaśniało. Delegat Action dwa parametry może przyjmować dopiero od wersji .NET Framework 3.5. Obejście, które zastosowałeś jest jak najbardziej w porządku. Mogłeś także napisać własny delegat. Wówczas nie musiałbyś dodawać tej klasy, np.:
private delegate void ChangeTextDelegate(string text, Control c);
private void ChangeText(string text, Control c)
{
if (c.InvokeRequired)
Invoke(new ChangeTextDelegate(ChangeText), new object[] { text, c });
else
c.Text = text;
}