• 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

0 głosów
1,694 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,040 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,040 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,040 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,040 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ź 800 wizyt
+1 głos
3 odpowiedzi 1,968 wizyt
pytanie zadane 21 sierpnia 2020 w C# przez Filip Sośnicki Nowicjusz (230 p.)

93,693 zapytań

142,612 odpowiedzi

323,223 komentarzy

63,222 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...