Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: proč nejde měnit text v textboxu z jiné třídy

Aktivity
Avatar
NeonMaster
Člen
Avatar
NeonMaster:27.1.2015 14:12

Ahoj. Mám problém nemůžu změnit text v textBoxu z jiné třídy v pohodě žádné errory a pak prostě když kód jede a má něco vypsat do textboxu z jiné třídy tak z ničeho nic vyskočí a napíše NullReference­Exception was unhandled. Co s tím? jak to mám opravit?
Děkuji za každou pomoc.

 
Odpovědět
27.1.2015 14:12
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na NeonMaster
David Hartinger:27.1.2015 14:17

Jak můžeš měnit TextBox z jiné třídy? Ten si přeci mění jen ta jedna třída, která reprezentuje formulář, ve kterém je vložený.

Nahoru Odpovědět
27.1.2015 14:17
You are the greatest project you will ever work on.
Avatar
NeonMaster
Člen
Avatar
Odpovídá na David Hartinger
NeonMaster:27.1.2015 14:26

To nejde? já myslím text změnit.

 
Nahoru Odpovědět
27.1.2015 14:26
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na NeonMaster
Petr Čech:27.1.2015 14:38

Tak sem dej nějaký kód, abychom věděli, co chceš dělat+ jakou používáš technologii. Nebo to prostě víc upřesni.

Nahoru Odpovědět
27.1.2015 14:38
the cake is a lie
Avatar
Honza
Člen
Avatar
Honza:27.1.2015 14:43

Každopádně podle chyby: NullReference­Exception bych tipoval, že se pokoušíš přistupovat k objektu (buď k tomu textboxu nebo k té třídě) od kterého nemáš vytvořenou instanci.
Ale bez kusu kódu kde ti to nefunguje to je jen hádání naslepo.

Nahoru Odpovědět
27.1.2015 14:43
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
NeonMaster
Člen
Avatar
NeonMaster:27.1.2015 15:19

Mám Form1 a třídu Class1 a textBox2 jediné co chci aby se ten text v tom textboxu změnil ze třídy Class1.Např:

textBox2.Text = "Ahoj";

A mám tam vytvořené to abych to mohl používat
ve Formu mám

Class1 trida3 = new Class1(textBox2);

a v Class1 potom

private TextBox textBox2;

       public Class1(TextBox textBox2)
       {
           this.textBox2 = textBox2;
       }
 
Nahoru Odpovědět
27.1.2015 15:19
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na NeonMaster
Petr Čech:27.1.2015 15:41

Tohle bude fungovat, zřejmě máš chybu někde jinde. Jen prosím nepoužívej Class1, textBox2, textBox1, Form1, je to neuvěřitelně nepřehledné. A ujisti se, že

Class1 trida3 = new Class1(textBox2);

děláš (Předpokládám, že v kostruktoru) po metodě InitializeCom­ponent();

Editováno 27.1.2015 15:42
Nahoru Odpovědět
27.1.2015 15:41
the cake is a lie
Avatar
NeonMaster
Člen
Avatar
Odpovídá na Petr Čech
NeonMaster:27.1.2015 15:48

Ano.
Ale kde tedy může být chyba mám tam 0 errors 0 warnings a program se vždycky zasekne až u toho když chci změnit ten text v textBoxu ;(

 
Nahoru Odpovědět
27.1.2015 15:48
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na NeonMaster
David Hartinger:27.1.2015 15:52

Předávat TextBox je nesmysl již jen z hlediska návrhu. Formulář slouží k tomu, aby se staral o nějaký objekt, ne aby se objekt naopak staral o jeho políčka a něco v nich měnil. Podívej se na zdejší seriál - http://www.itnetwork.cz/csharp/wpf

Nahoru Odpovědět
27.1.2015 15:52
You are the greatest project you will ever work on.
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na NeonMaster
Petr Čech:27.1.2015 16:05

Ale program se může zaseknout i za běhu, právě typickým příkladem je NullReference­Exception, těch možností, jak to rozbít a kompilátor to prostě nemá šanci ošetřit je spousty, namátkově třeba neexistující index v poli nebo neexistující soubor a tak. Z toho vyplývá, že zkompilování bez chyb nezaručuje správný běh bez vyjímek. Nehledě na to, že tu vyjímku můžeš vyhodit manuálně. Já osobně NullRefernece­Exception řeším tak, že si do Debug.WriteLine(); Zaznamenávám, kde objekt ještě není null, na zlomu se potom podívám na logiku předávání dat.
Jinak @David Hartinger mám dojem, že to dělá ve WinFroms, jen to vygeneruje Form1.cs

Nahoru Odpovědět
27.1.2015 16:05
the cake is a lie
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Petr Čech
David Hartinger:27.1.2015 16:08

Tím hůře, když WF je prakticky mrtvé :)

Nahoru Odpovědět
27.1.2015 16:08
You are the greatest project you will ever work on.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na David Hartinger
Jan Vargovský:27.1.2015 16:23

Ve WPF pak ale textbox nehandluješ v code-behind od Window.

 
Nahoru Odpovědět
27.1.2015 16:23
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Petr Čech:27.1.2015 16:26

Proč ne? Objekt jako objekt.

Nahoru Odpovědět
27.1.2015 16:26
the cake is a lie
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Čech
Jan Vargovský:27.1.2015 16:35

Protože se většinou využívá MVVM pattern + commandy na handlení eventů.

Jestli si ale budeš něco hledat ke commandům, tak nejméně 50% všech implementací je špatně. Tak samo jako ukázka, že VM můžeš dělat z DependencyObjectu a další hovadiny.

Editováno 27.1.2015 16:38
 
Nahoru Odpovědět
27.1.2015 16:35
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Jan Vargovský
David Hartinger:27.1.2015 16:38

Pokud není nabindovaný, tak jo. A pokud je nabindovaný na VM, tak si to ten TextBox dělá sám, protože reaguje na nějakou událost. Nikdo ho z nějaké třídy nenastavuje :)

Nahoru Odpovědět
27.1.2015 16:38
You are the greatest project you will ever work on.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na David Hartinger
Jan Vargovský:27.1.2015 16:41

To ano, ale pak je úplně jedno jestli ten člověk používá WPF nebo WF, protože ty technologie používá úplně stejně. Sice má ve WPF větší možnosti, ale pořád to bastlí jako ve WF. Potom tu každý doporučuje WPF před WF, i když pak pracují s tou technologií blbě.

 
Nahoru Odpovědět
27.1.2015 16:41
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Jan Vargovský
David Hartinger:27.1.2015 18:04

A ja snad neco takoveho psal? :) Ze nema predavat TextBox a ze WF je staré jsem poslal jako 2 oddelene informace, které spolu nesouvisí.

Nahoru Odpovědět
27.1.2015 18:04
You are the greatest project you will ever work on.
Avatar
sorg
Člen
Avatar
sorg:30.1.2015 10:13

Když přidáš textbox na formulář, je implicitně private. Můžeš ho designeru nastavit na public a pak přistupovat k textbox.Text odkudkoliv, ale je to prasárna.
Ve třídě ve kterém máš textbox si udělej propertu, která ti umžní přistupovat k textboxu zvenčí.

public TextboxText
{
get {return this.textbox1­.Text;}
set {this.textbox1.Text = value}
}

Tohle ti umožní změnit string v textboxu odkudkoliv, kde vytvoříš instanci formuláře, kde ten textbox sedí.

A tohle funguje jak ve WinFormsech, tak WPF, protože to není o konkrétním framworku, ale spíše o věcech, které souvisejí s OOP jako takovým.

Editováno 30.1.2015 10:16
 
Nahoru Odpovědět
30.1.2015 10:13
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 18 zpráv z 18.