• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dodawanie komponentów "manualnie" w Visual Studio

Object Storage Arubacloud
0 głosów
1,351 wizyt
pytanie zadane 11 września 2015 w C# przez Ceki Mądrala (5,310 p.)
Witam czy isnieje dodanie komponentów (Poprzez własnoręczne wpisanie kodu) w pliku który jest odpowiedzialny za "logikę" kodu w np. pętli for (w Visual Studio w języku C#). Z Góry dziekuje za odpowiedź ;) pozdrawiam.

1 odpowiedź

0 głosów
odpowiedź 11 września 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)
wybrane 12 września 2015 przez Ceki
 
Najlepsza

Zrozumiałem to tak, że chcesz utworzyć jakiś komponent nie przeciągając go myszkiem, tylko własnoręcznie klepiąc kod. Jest to wtedy tworzone dynamicznie i z tego co pamiętam, nie widzisz tego komponentu w oknie podglądu aplikacji. Podam przykład jak ja tworzę label w kodzie mechaniki w Windows Forms. Nie napisałeś czy piszesz w Windows Forms czy WPF, więc strzelam.

Label namelabel = new Label();
namelabel.Location = new Point(13, 13);
namelabel.Text = name;

Wyżej zmieniam atrybut Text. Ale w ten sam sposób ustalasz całą resztę.

komentarz 11 września 2015 przez Ceki Mądrala (5,310 p.)

Ja uzyłem Windows Forms ;) ale ten kod nie wyświetla mi tego napisu. :/

Wstawię kod, może to pomoże :)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace na_technike
{
    public partial class Form1 : Form
    {
        int squareSizeX;
        int squareSizeY;
        int tableSizeX;
        int tableSizeY;

        public Form1(int squareSizeX, int squareSizeY, int tableSizeX, int tableSizeY)
        {
            InitializeComponent();

            this.squareSizeX = squareSizeX;
            this.squareSizeY = squareSizeY;
            this.tableSizeX = tableSizeX;
            this.tableSizeY = tableSizeY;

        }

        public void rysuj()
        {
            
            Random randomNumber = new Random();
            SolidBrush sb = new SolidBrush(Color.Red);
            Graphics g = panel1.CreateGraphics();

            int liczbaKwadratu=1;

            for (int y=0; y<tableSizeY; y++)
            {
                for(int x=0; x<tableSizeX; x++)
                {
                    //kwadrat
                    sb.Color = Color.FromArgb(randomNumber.Next(100), randomNumber.Next(100), randomNumber.Next(100));
                    g.FillRectangle(sb, x*squareSizeX, y* squareSizeY, squareSizeX, squareSizeY);

                    //numer kwadratu
                    Label numer = new Label();
                    numer.Location = new Point(13, 13);
                    numer.Text = liczbaKwadratu.ToString();
                                      
                    liczbaKwadratu++;
                }
            }
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            rysuj();
        }
    }
}

 

komentarz 11 września 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)

Aby mój powyższy label się pojawił musisz na koniec wywołać:

this.Controls.Add( numer );

Po ustawieniu parametrów to wywolujesz. Powinno śmigać :-)

 

Bardzo często jednak tworząc dynamicznie jakieś komponenty zamyka się je w funkcjach. Aby nie śmiecić kodu i nie ustawiać wszystkich parametrów po kolei.
Przykładowa funkcja tworząca dynamiczny komponent wraz z jej wywołaniem moze wygladać tak:

        public Form1()
        {
            InitializeComponent();
            AddNewTextBox();
        }


        public TextBox AddNewTextBox()
        {
            TextBox txt = new TextBox();
            this.Controls.Add(txt);
            txt.Top = 25;
            txt.Left = 100;
            txt.Text = "TextBox ";
            return txt;
        }

Pozdrawiam.

komentarz 11 września 2015 przez Ceki Mądrala (5,310 p.)
Dziala, ale zauważ, że na formie jest rozciągnięty komponent typu panel (Widac to w tej linijce w której zdefiniowałem zmienną g kóra jest instancją obiektu Graphics, czyli w lini 36) i to on zasłania napis, wiesz może co z tym zrobic? Pozdrawiam ;).
komentarz 11 września 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)

Jak coś co ma być na wierzchu jest zasłaniane, to wywołaj dla tego elementu jeszcze jdną metodę. Użyj:

numer.BringToFront();

Teraz powinno śmigać :-)
Pomogłem już? :-P

komentarz 12 września 2015 przez Ceki Mądrala (5,310 p.)

Super, Dzięki bardzo, ale jest jeszcze jeden problem. N panelu są narysowane kwadraty a label na nich, czy istnieje mozliwość aby usunąć białe tło z label'a tak aby nie zasłaniało kwadratów? Szukałem w internecie ale znalazłem tylko coś takiego 

label.BackColor = Color.Transparent;

ale to (przynajmniej w moim przypadku) nie dziala ;/ czy istnieje jakis sposób aby kolor tła napisu był niewidzialny?

komentarz 12 września 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)
edycja 6 lutego 2016 przez Sebastian Fojcik
Niestety taka przezroczystość jaką chcesz uzyskać nie jest obsługiwana.

Ale jeśli twój label jest na tle jakiegoś obrazka, to możesz ustawić temu label ten obrazek jako tło. Zajrzyj tutaj:
http://www.codeproject.com/Articles/25048/How-to-Use-Transparent-Images-and-Labels-in-Window
Bardzo ciekawa sztuczka.

Ustawianie BackColor na Transparent powoduje, że ustawiasz kolor tła na taki, jakie jest za Label. Żadna to przezroczystość, tylko oszukiwanie :-)
komentarz 12 września 2015 przez Ceki Mądrala (5,310 p.)
Szkoda, no ale dzięki za wszystko ;) Pozdrawiam.

Podobne pytania

0 głosów
1 odpowiedź 526 wizyt
+1 głos
3 odpowiedzi 1,113 wizyt
pytanie zadane 21 sierpnia 2020 w C# przez Filip Sośnicki Nowicjusz (230 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...