Avatar billede mr_falle Nybegynder
27. maj 2008 - 14:30 Der er 8 kommentarer og
1 løsning

Ændre UserControl fra class.

Hej

Jeg har en datahandler class, og ud fra denne class vil jeg gerne kunne åbne forskellelige UserControls i mit Main vindue!
Hvordan kan man gøre det?
Avatar billede mr_falle Nybegynder
27. maj 2008 - 15:08 #1
Ligeledes vil jeg gerne kunne skrive til du forskellige controls (textboxe, listview ect) der ligger i den valgte usercontrol.

Nogle der kan hjælpe?
Avatar billede hmortensen Nybegynder
27. maj 2008 - 16:14 #2
I din UC laver du nogle properties som f.eks.:

public string MinTextBox
{
  get { return textBox1.Text; }
  set { textbox1.Text = value; }
}
Avatar billede mr_falle Nybegynder
27. maj 2008 - 17:54 #3
Jeg får denne fejl når jeg prøvet at ændre UserControl fra min class:

Handling på tværs af tråde er ugyldig: Objektet 'UserPanel' blev åbnet fra en anden tråd end den tråd, det blev oprettet i.

Hjælp!!!!
Avatar billede mr_falle Nybegynder
27. maj 2008 - 19:58 #4
Nu har jeg fundet ud af det med at åbne/lukke dem.. Brugte delegates...

Men jeg kan ikke få dit eksempel til at virke hmortensen!!

Hvor skal jeg skrive koden henne??
Avatar billede aaberg Nybegynder
27. maj 2008 - 22:00 #5
For at undgå cross-thread fejlen, bliver du nød til at tilgå din UserControl via Invoke() metoden. Invoke() metoden tager imod en delegate, denne delegate bliver da kørt i brugergrænsesnittets tråd. For at gøre dette nemt, kan det anbefales at bruge anonyme delegates.

Først et eksempel på, hvordan man ikke skal gøre:
myUserControl.BackColor = Color.Blue;

Denne kode giver den fejl du har beskrevet. For at bruge invoke med anonyme delegates, skal man have en eller anden delegate at referere til. Tilføj f.eks. følgende kode et eller andet sted i dit namespace eller klasse:

public delegate void Invoker();


Når du så skal gøre noget med din UserControl, gør da følgende:

myUserControl.Invoke(new Invoker(delegate()
{
  myUserControl.BackColor = Color.Blue;
}));

Så slipper du Cross-Thread fejlen.

Dette eksempel er lidt simpelt, men jeg håber du kan bruge det til noget!?
Avatar billede mr_falle Nybegynder
28. maj 2008 - 16:04 #6
Så har jeg fået det til at virke.. sådan næsten da :(

Når jeg lukker et US ved panel.clear(), så næste gang jeg åbner denne US igen, er den tekst jeg en gangfør har tilføjet til US, der stadig...

Jeg har prøvet at sætte f.eks textbox1.test = "" under US load, men det hjælper ikke.

Nogle der kan hjælpe?
Avatar billede aaberg Nybegynder
29. maj 2008 - 07:52 #7
Når du kalder panel.Clear() bliver din UserControl fjernet fra panelet, men den bliver ikke destrueret. Når du tilføjer den samme UserControl igen senere, vil den være i samme state som da du fjernet den. OnLoad bliver kun kaldt når UserControl klassen bliver instantieret, og ikke når den bliver fjernet fra en panel.

Instantier en ny instans af din UserControl i stedet!

myUserControlObject = new MyUserControl();

panel.Controls.Add(myUserControlObject);
Avatar billede mr_falle Nybegynder
31. maj 2008 - 14:06 #8
super.. tak... smid svar
Avatar billede aaberg Nybegynder
01. juni 2008 - 10:35 #9
Svar :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester