C# Skracanie zapisu

Witam

Mam taki oto problem.

Załóżmy, że mam stworzonych 10 labelów, textboxów czy kto co sobie jeszcze chce.

żeby wpisać do nich liczby od 1 do 10 muszę napisać tyle

label1.Text = “1”;

label2.Text = “2”;

label3.Text = “3”;

label4.Text = “4”;

label10.Text = “10”;

Czy da się to skrócić jakoś ??

np.

for(int i=1;i<=10;i++)

{

i tutaj coś żeby wiedział, że do labelu1 wpisać 1

np. label(i) = i;

chciałbym, żeby zamiast (i) znalazło się tam 1 i w rezultacie label1

}

Pozdrawiam

Musisz te labele przetrzymywać w tablicy. Przykład:

Label[] labels = new Label[10];

//Tu uzupełnianie tych opisów, wrzucenie ich na Forma, etc.

for(int i = 0; i < 10; ++i)

{

   labels[i].Text = i.ToString();

}

EDIT: To z pośpiechu :wink: Ale masz racje, można to też tak zrobić.

Wcale nie musi używać tablicy, bo tablica, a raczej kolekcja już jest, trzeba tylko wyciągnąć z niej labele i powiązać ich Text z Name.

foreach (Control c in this.Controls)

    if (c is Label)

        c.Text = c.Name.Replace("label", "");

P.S. Fiołek - zrobiłeś dwa błędy w swoim przykładzie :wink:

Hmmmmm co do drugiego rozwiązania to chce zrobić coś innego niż tekst, tekst to był przykład. Od razu mówię, że nie rozumiem jak wykorzystać tamten zapis do zmiany koloru. Ja chciałem zrobić coś takiego

int[] tab = new int[4];

Color kolor = Color.White;

Color kolor2 = Color.FromArgb(45,45,45);


for(int i=0;i<4;i++)

{

	if(tab[i]==1)

	{

		label[i].BackColor=kolor;

	}

	else

	{

		label[i].BackColor=kolor2;

	}

}

Oczywiśnie wiem że to nie ma prawa działać ale chodzi mi ogólnie o coś takiego. Jeśli chodzi o tablicę to mogę tak zrobić ale wtedy mam dużo więcej kodu do zapisania ponieważ mam dużo tych labeli. :edit: Dopisze jeszcze coś. Moje zamierzenie jest takie

void zmiana(int poczatek, int koniec)

{

int[] tab = new int[4];

Color kolor = Color.White;

Color kolor2 = Color.FromArgb(45,45,45);

int j=0;

for(int i=poczatek;i
{

	if(tab[j]==1)

	{

		label[i].BackColor=kolor;

	}

	else

	{

		label[i].BackColor=kolor2;

	}

j++;

}

chciałbym do funkcji przekazywać tylko numerki labelów.

Nadal masz dwie możliwości:

  1. robisz tablicę

  2. nie robisz tablicy, ale nazwy tych labeli muszą być utworzone wg jakiegoś schematu, np. tak jak domyślnie tworzy designer: label1, label2, label3 … label65536

Wtedy labele od możesz zmienić takim kodem:

private void ZmieńKolorTłaEtykiet(int pierwsza, int ostatnia, Color kolorDocelowy)

{

    //dla każdej kontrolki na formatce (formularzu, okienku - jak zwał, tak zwał)

    foreach (Control c in this.Controls)

        //jeśli jest ona Labelem (a nie przyciskiem, checkboxem czy czymkolwiek innym)

        if (c is Label)

        {

            //wyciągamy jej numer z nazwy kasując napis "label"

            string numerWNazwie = c.Name.Replace("label", "");

            //można też skasować pierwszych 5 znaków - jak kto woli

            //string numerWNazwie = c.Name.Remove(0, 5);

            //konwertujemy go do inta

            int numer = Int32.Parse(numerWNazwie);

            //jeśli numer pasuje

            if (numer >= pierwsza && numer <= ostatnia)

                //to zmieniamy kolor tła na docelowy

                c.BackColor = kolorDocelowy;

        }

}

Mam nadzieję, że teraz jasne…

Ogólnie tą pętle zrozumiałem i dokładnie coś takiego wymyśliłem wczoraj po położeniu sie spać :))

Prawie wszystko da się zrobić na wiele sposobów, ale sądzę, że ta wersja jest optymalna.

Tylko mała uwaga - to nie będzie działać, jeśli labele masz nie bezpośrednio na formie, tylko w jakichś innych kontenerach (typu panel, groupbox, tabpanel). Wówczas należałoby przerobić tę metodę, aby działała rekurencyjnie.

W zasadzie mi też się coś takiego przyda, więc jeszcze ulepszyłem. Teraz można przekazać typ kontrolki do zmiany koloru tła, więc działa z przyciskami, etykietami i czym się chce :slight_smile:

private void ZmieńKolorTłaKontrolek(int pierwsza, int ostatnia, Color kolorDocelowy) 

where T: Control

{

    //dla każdej kontrolki na formatce (formularzu, okienku - jak zwał, tak zwał)

    foreach (Control c in this.Controls)

        //jeśli jest ona żądanego typu

        if (c is T)

        {

            //pobieramy numer z nazwy

            int numer = this.PobierzNumerZNazwyKontrolki(c.Name);

            //jeśli numer pasuje

            if (numer >= pierwsza && numer <= ostatnia)

                //to zmieniamy kolor tła na docelowy

                c.BackColor = kolorDocelowy;

        }

}


private int PobierzNumerZNazwyKontrolki(string nazwa)

{

    int numer;

    string cyfry = String.Empty;

    //dla każdego znaku w nazwie

    for (int i = 0; i < nazwa.Length; i++)

        //jeśli jest cyfrą

        if (Char.IsDigit(nazwa[i]))

            //to jest dodawany

            cyfry += nazwa[i];

    //próba konwersji

    Int32.TryParse(cyfry, out numer);

    //zwrócenie wartości - uwaga, w przypadku, gdy w nazwie nie ma żadnego numeru zwróci 0

    return numer;

}

Sposób użycia:

private void Form1_Load(object sender, EventArgs e)

{

    this.ZmieńKolorTłaKontrolek(3, 7, kolor);

    this.ZmieńKolorTłaKontrolek(5, 9, kolor);

}

A żeby nie zakładać nowego tematu to jak zrobić opóźnienie czasowe ??

Chce np. żeby po kliknięciu na przycisk pojawił się na nim tekst i za jakiś czas zniknął. Dokładniej to chciałbym opóźnić wykonanie kodu

instrukcje

chwile poczekać

dalsze instrukcje

System.Threading.Thread.Sleep lub zrobić na timerze.