Diskuze: Event na kontrolovanie kontrolky TextBlock

C# .NET .NET (C# a Visual Basic) Event na kontrolovanie kontrolky TextBlock American English version English version

Avatar
roks
Člen
Avatar
roks:

Zdravím, mám kontrolkou TextBlock a potrebujem aby stále niečo kontrolovala a podla toho sa prepisovala. Kontrolku nie je možné pomenovať, lebo je vytvorená cyklicky spolu s ďalšími takýmito kontrolkami. Takže potrebujem dosiahnuť, aby nejakým eventom kontrolovala údaje. Vedel by mi niekto poradiť?

 
Odpovědět 1.5.2014 11:34
Avatar
rwn
Člen
Avatar
Odpovídá na roks
rwn:

Kdyř jí vytváříš cykliscky (hadam cyklem for), tak proč tam nedáš, že třeba u 5. cyklu se vytvoří EventHandler k dané kontrolce. Nebo by to asi i šlo, kdybys jí nastavil třeba tag podle cyklu, v kterém byla vytvořena a pak s ní přes tag manipulovat. :)

Nahoru Odpovědět 1.5.2014 14:10
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na roks
Jan Vargovský:

"Kontrolku nie je možné pomenovať, lebo je vytvorená cyklicky spolu s ďalšími takýmito kontrolkami."

Odkud si na tohle přišel? :)

 
Nahoru Odpovědět  +2 1.5.2014 14:36
Avatar
roks
Člen
Avatar
Odpovídá na rwn
roks:

Mám ju "otagovanú"ale neviem ako s ňou manipulovať, aby sa stále kontrolovala. A aký Event by si mi odporučil na túto moju konkrétnu situáciu? :)

 
Nahoru Odpovědět 1.5.2014 18:01
Avatar
roks
Člen
Avatar
Odpovídá na Jan Vargovský
roks:

Tak neviem si predstaviť ako by som v kóde napísal, aby sa menila kontrolka, ktorej priradím meno a ešte pred tým na ňu vložím príkaz :) neviem si to predstaviť, ale preto píšem sem, lebo tu máte oveľa viac skúseností

 
Nahoru Odpovědět 1.5.2014 18:04
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na roks
Jan Vargovský:

Nevím co kontroluješ, ale jestli máš nějakou proměnnou, tak si k ní vytvoříš event a když jí budeš nastavovat, tak vyvoláš event, ve kterém změníš nějaký ten tvůj text.

Já si moc nedokážu představit o co se vlastně snažíš. Pošli kousky kódu (jak vytváříš ten textblock, kde a jak se mění hodnota)

 
Nahoru Odpovědět 1.5.2014 18:21
Avatar
roks
Člen
Avatar
Odpovídá na Jan Vargovský
roks:

Ok, kód je napísaný tak "všeliak" tak ale toto pošlem:

private void vykresliFunkcieUdalosti()
        {
            sp.Children.Clear();
            for (int i = 0; i < App.Objekty[index].Udalosti[indexUdalosti].Funkcie.Count; i++)
            {
                Button btn = new Button(); btn.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id;
                btn.Height = 32; btn.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF272727"));
                Grid grid = new Grid(); grid.Width = 1500;
                grid.Height = 24; grid.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id;
                Image image = new Image();
                image.Source = konvertujBmp(Gamenator_1._0.Properties.Resources.create);
                image.Width = 24; image.Height = 24; image.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; image.VerticalAlignment = System.Windows.VerticalAlignment.Center; image.Margin = new Thickness(10, 0, 0, 0); grid.Children.Add(image);
                TextBlock text = new TextBlock(); text.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; text.VerticalAlignment = System.Windows.VerticalAlignment.Center; text.Margin = new Thickness(50, 0, 0, 0); text.Foreground = new SolidColorBrush(Colors.White); grid.Children.Add(text);
                text.FontSize = 14; text.Foreground = new SolidColorBrush(Colors.White); text.FontSize = 14;
                string funkcia = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Kod;
                string[] pole = Regex.Split(funkcia, "<■m■e■d■z■e■r■a■>");
                if (pole[0] == "<■create■>")
                {
                    text.Text = "Vytvoriť objekt";
                    TextBlock textObjekt = new TextBlock(); textObjekt.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; textObjekt.VerticalAlignment = System.Windows.VerticalAlignment.Center; textObjekt.Margin = new Thickness(180, 0, 0, 0); textObjekt.Foreground = new SolidColorBrush(Colors.White); grid.Children.Add(textObjekt); text.FontSize = 12;
                    var vyberObj = App.Objekty.SingleOrDefault(x => x.Id == Convert.ToInt32(pole[1]));
                    if (vyberObj != null)
                        textObjekt.Text = vyberObj.Meno;
                    else
                        textObjekt.Text = "null";
                    textObjekt.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id + "■1■4";
                    Border brd = new Border(); ImageBrush pridajObr = new ImageBrush(); pridajObr.ImageSource = konvertujBmp(Gamenator_1._0.Properties.Resources.create);
                    brd.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; brd.VerticalAlignment = System.Windows.VerticalAlignment.Center;
                    brd.MouseLeave += new MouseEventHandler(brd_MouseLeave); brd.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id + "■1■4";
                    Grid btnObr = new Grid(); btnObr.Height = 16; btnObr.Width = 16;
                    btnObr.Background = pridajObr; brd.Child = btnObr;
                    brd.MouseMove += new MouseEventHandler(brd_MouseMove); brd.MouseUp += brd_MouseUp; brd.MouseDown += brd_MouseDown; brd.MouseEnter += brd_MouseEnter;
                    brd.Height = 18; brd.Width = 18; brd.BorderBrush = new SolidColorBrush(Colors.Transparent); brd.BorderThickness = new Thickness(1, 1, 1, 1); brd.Margin = new Thickness(225, 0, 0, 0);
                    grid.Children.Add(brd);
                    TextBlock textX = new TextBlock(); textX.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; textX.VerticalAlignment = System.Windows.VerticalAlignment.Center; textX.Margin = new Thickness(270, 0, 0, 0); textX.Foreground = new SolidColorBrush(Colors.White); grid.Children.Add(textX); textX.Text = "X:"; textX.FontSize = 12;
                    TextBlock textY = new TextBlock(); textY.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; textY.VerticalAlignment = System.Windows.VerticalAlignment.Center; textY.Margin = new Thickness(360, 0, 0, 0); textY.Foreground = new SolidColorBrush(Colors.White); grid.Children.Add(textY); textY.Text = "Y:"; textY.FontSize = 12;
                    TextBlock textZ = new TextBlock(); textZ.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; textZ.VerticalAlignment = System.Windows.VerticalAlignment.Center; textZ.Margin = new Thickness(450, 0, 0, 0); textZ.Foreground = new SolidColorBrush(Colors.White); grid.Children.Add(textZ); textZ.Text = "Z:"; textZ.FontSize = 12;
                    TextBox tbX = new TextBox(); tbX.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; tbX.VerticalAlignment = System.Windows.VerticalAlignment.Center; tbX.Margin = new Thickness(290, 0, 0, 0); tbX.Foreground = new SolidColorBrush(Colors.White); tbX.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id + "■2■4";
                    tbX.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF272727")); tbX.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#59616C")); grid.Children.Add(tbX); tbX.Height = 20; tbX.Width = 60; tbX.FlowDirection = System.Windows.FlowDirection.LeftToRight; tbX.Text = pole[2]; tbX.TextChanged += textoveBoxy_TextChanged;
                    TextBox tbY = new TextBox(); tbY.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; tbY.VerticalAlignment = System.Windows.VerticalAlignment.Center; tbY.Margin = new Thickness(380, 0, 0, 0); tbY.Foreground = new SolidColorBrush(Colors.White); tbY.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id + "■3■4";
                    tbY.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF272727")); tbY.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#59616C")); grid.Children.Add(tbY); tbY.Height = 20; tbY.Width = 60; tbY.FlowDirection = System.Windows.FlowDirection.LeftToRight; tbY.Text = pole[3]; tbY.TextChanged += textoveBoxy_TextChanged;
                    TextBox tbZ = new TextBox(); tbZ.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; tbZ.VerticalAlignment = System.Windows.VerticalAlignment.Center; tbZ.Margin = new Thickness(470, 0, 0, 0); tbZ.Foreground = new SolidColorBrush(Colors.White); tbZ.Tag = App.Objekty[index].Udalosti[indexUdalosti].Funkcie[i].Id + "■4■4";
                    tbZ.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF272727")); tbZ.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#59616C")); grid.Children.Add(tbZ); tbZ.Height = 20; tbZ.Width = 60; tbZ.FlowDirection = System.Windows.FlowDirection.LeftToRight; tbZ.Text = pole[4]; tbZ.TextChanged += textoveBoxy_TextChanged;
                }
btn.Content = grid;
                sp.Children.Add(btn);
            }
        }

chcem vlastne zmeniť hodnotu z kontextového menu (meno objektu), ktoré sa otvorí po kliknutí na border (po nadídení naň)

MenuItem item = sender as MenuItem;
            var vyberObj = App.Objekty.SingleOrDefault(x => x.Meno == item.Header);
            if (vyberObj != null)
            {
                string[] pole = item.Tag.ToString().Split('■');
                var vyberUdalost = App.Objekty[index].Udalosti[indexUdalosti].Funkcie.SingleOrDefault(y => y.Id == Convert.ToInt32(pole[0]));
                if (vyberUdalost != null)
                {
                    string[] poleUdalosti = Regex.Split(vyberUdalost.Kod, "<■m■e■d■z■e■r■a■>");
                    poleUdalosti[Convert.ToInt32(pole[1])] = vyberObj.Id.ToString();
                    string funkcia = "";
                    for (int i = 0; i  < Convert.ToInt32(pole[2]); i++)
                    {
                        funkcia += poleUdalosti[i];
                        funkcia += "<■m■e■d■z■e■r■a■>";
                    }
                    funkcia += poleUdalosti[Convert.ToInt32(pole[2])];
                    vyberUdalost.Kod = funkcia;
                }
            }

neviem či to takto pochopíš, o čo sa asi jedná, ale hádam hej :)

 
Nahoru Odpovědět 1.5.2014 18:40
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na roks
Jan Vargovský:

Přepiš to tak, aby se v tom dalo číst. Je tam plno redudantního kódu, který by šel pěkně zredukovat. Minimálně aspoň upravit kód, aby jsi neměl na řádku 400 znaků...

David Čápka Máš tu trošku error :)

 
Nahoru Odpovědět  +1 1.5.2014 18:47
Avatar
Odpovídá na Jan Vargovský
Josef Kuchař (Pepa489):

Nejspíš to dělá ten dlouhý code

Nahoru Odpovědět 1.5.2014 18:57
2x piš, jednou debuguj
Avatar
roks
Člen
Avatar
Odpovídá na Jan Vargovský
roks:

Ok, ale neviem aký event použiť na tú zmenu hodnoty ;)

 
Nahoru Odpovědět 1.5.2014 19:35
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na roks
Jan Vargovský:

Přepiš kód, pak se ho možná budu snažit pochopit a můžu ti poradit ;)

 
Nahoru Odpovědět 1.5.2014 20:02
Avatar
rwn
Člen
Avatar
rwn:

Onehdá jsem si dělal něco podobného. Dělal jsem to teda přes FlowLayoutPanel (WF), kde jsem si cyklem vygeneroval 6comboboxu a pomocí tagu - čísla cyklu při generování jsem si do comboboxu nahraval itemy. Přičemž jsem si při vytvoření comboboxu generoval i událost na změnu itemu. Takže když mě někdo u jednoho změnil hodnotu, tak se zavolala událost.
Představuju si to tak, že pokudpotřebuješ událost jen u jednoho, tak si v cyklu dáš podmínku - třeba pokud počet cyklu se rovna nějakému číslu, tak vytvoř událost pro onu kontrolku. :)

Nahoru Odpovědět 1.5.2014 20:47
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
roks
Člen
Avatar
roks:

Včera som tu nebol, tak som nemohol odpísať, vďaka za rady :) vytvoril som si funkciu, ktorá mi zistí daný objekt (v mojom prípade TextBlock) a uloží ho do premenne kontrolkaTextBlock. Kód vyzerá asi takto:

private object oznacenyObjekt(object sender)
        {
            Border border = sender as Border;
            Grid grid = border.Parent as Grid;
            UIElementCollection kolekcia = grid.Children;
            TextBlock text = kolekcia[2] as TextBlock;
            return text;
        }

a potom už len do TextBlocku zapíšem môj text, ale vďaka vám za užitočné rady :)

 
Nahoru Odpovědět 3.5.2014 10:26
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.