Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] Replace Text value form other UserControl

Pagina: 1
Acties:
  • 455 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hopelijk kan ik de situatie goed omschrijven:

Een simpele applicatie "mainForm" met 3 UserControls (3 panels).
Deze UserControls instantieer ik op het moment dat de applicatie start. Daarna zet ik meteen Visible op false, behalve die van UserControl1.
Nu heb ik op UserControl1 een Textbox staan en op UserControl2 een button.
Met deze button wil ik de Text value van de TextBox op UserControl 1 aanpassen.

Op UserControl1 heb ik het volgende staan om de TextBox.Text public te krijgen:

C#:
1
2
3
4
5
6
7
8
9
10
11
public string TxtValue
{
   get 
   {
      txtKNA1.Text;
   }
   set
   {
      txtKNA1.Text = value;
   }
}


Op UserControl2 gebeurt er dit als ik op de Button klik:
C#:
1
2
3
4
5
private void btn_Click(object sender, EventArgs e)
{
   UserControl1 uc = new UserControl1();
   uc.TxtValue = "en hier de text";
}


Als ik nu weer "terugschakel" (ik heb een menuStrip waardoor ik kan switchen van UserControls.Visible) naar UserControl1.Visible, dan is de Text niet aangepast.

Ik heb al 100.000 breakpoint in mijn code gehad om te kijken wat er allemaal gebeurt met de Text value van de TextBox en dat ziet er allemaal prima uit. Overal is dat die "nieuwe" Text.

Het wil alleen maar niet lukken om die "nieuwe" Text ook visueel in die TextBox te krijgen.

Zie ik iets over het hoofd?


ps: de UserControls worden "over elkaar heen" geladen en alleen verborgen met de Visible property.

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 01:56
C#:
1
UserControl1 uc = new UserControl1(); 

Je maakt hier een nieuwe UserControl1, hebt de referentie naar het UserControl1 op je mainform nodig.

Roomba E5 te koop


Verwijderd

Topicstarter
sig69 schreef op donderdag 20 december 2007 @ 14:19:
C#:
1
UserControl1 uc = new UserControl1(); 

Je maakt hier een nieuwe UserControl1, hebt de referentie naar het UserControl1 op je mainform nodig.
Ik had al zo'n vaag vermoeden.
Kan je me een trap in de goede richting geven hoe ik die referentie doorgeef? Ik ben even lost :'(

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 01:56
Er zijn vele wegen die naar rome leiden, maar je zou bijvoorbeeld:
• De constructor van UserControl2 aanpassen dat ie een Form als parameter meekrijgt, waarin je een referentie naar je mainform meegeeft. In je mainform maak je dan een public property voor Usercontrol1. Je kan dan dus vanuit UserControl2 via het Form bij UserControl1.
• Je gooit in UserControl2 na het klikken op de knop een event, waar je mainform naar luistert. In je eventhandler doe je dan dingen met UserControl1

De tweede optie is wat netter vind ik zelf.

[ Voor 8% gewijzigd door sig69 op 20-12-2007 14:26 ]

Roomba E5 te koop


Verwijderd

Topicstarter
Thanx! Ik ga ermee bezig. Bedankt voor de "trap".

Verwijderd

Topicstarter
Damn! Ik kom er toch echt niet uit. Heb nog een extra trap nodig...

Waar declareer ik mijn event? In userControl2? En mijn EventHandler?
En hoe laat ik mijn mainForm naar dat event "luisteren"?

Ik heb ieder boek wat ik hier heb liggen erop nageslagen, maar alle voorbeelden daaruit kan ik heel moeilijk in mijn specifieke context plaatsen.

[ Voor 3% gewijzigd door Verwijderd op 20-12-2007 16:11 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 01:56
Zoiets zou het kunnen zijn:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public partial class UserControl2 : UserControl
{
  public event EventHandler<Args> SomeEvent;

  private void button1_Click(object sender, EventArgs e)
  {
    if(SomeEvent != null)
      SomeEvent(this, new Args());
  }

  public class Args : EventArgs
  {
    // Jou fields etc
  }
}


Vanuit je main form kun je dan naar "SomeEvent" luisteren

[ Voor 8% gewijzigd door sig69 op 20-12-2007 17:04 ]

Roomba E5 te koop


  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

als je je mainForm.uc.TxTvalue veranderd moet het toch gewoon goed gaan.

Voor zover ik zie zit je vooral in een andere instantie van je uc te klooien.

Death smiles at us all, all a man can do is smile back.
PSN


  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

C#:
1
2
3
4
5
6
7
8
9
10
11
12
public string TxtValue
{
   get 
   {
      return txtKNA1.Text;
      //txtKNA1.Text;
   }
   set
   {
      txtKNA1.Text = value;
   }
}

Zonder je topic te hebben doorgelezen zag ik deze fout.

Going for adventure, lots of sun and a convertible! | GMT-8


Verwijderd

Topicstarter
Sorry, dat was een typo.

Verwijderd

Topicstarter
YakuzA schreef op donderdag 20 december 2007 @ 16:23:
als je je mainForm.uc.TxTvalue veranderd moet het toch gewoon goed gaan.
Maar die is dus niet beschikbaar binnen uc2.

Verwijderd

Topicstarter
sig69 schreef op donderdag 20 december 2007 @ 16:20:
Zoiets zou het kunnen zijn:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public partial class UserControl1 : UserControl
{
  public event EventHandler<Args> SomeEvent;

  private void button1_Click(object sender, EventArgs e)
  {
    if(SomeEvent != null)
      SomeEvent(this, new Args());
  }

  public class Args : EventArgs
  {
    // Jou fields etc
  }
}


Vanuit je main form kun je dan naar "SomeEvent" luisteren
Ik snap jouw voorbeeld even niet.
In mijn geval staat die button juist op UserControl2 en die TextBox die een Text moet krijgen op UserControl1.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wat je nu probeert te doen is direct op een UserControl( View ) een label te wijzigen. Dat kan inderdaad door te zorgen dat UserControl 2 een refference heeft naar UserControl1 en dat UserControl1 een Text Property heeft waar je de text kan wijzigen.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class MyForm : Form
{
    public MyForm()
    {
        UserControl1 uc1 = new UserControl1();
        UserControl2 uc2 = new UserControl2(uc1);
        Controls.Add(uc1);
        Controls.Add(uc2);
    }
}

class UserControl1 : UserControl
{
    private Label myLabel;

    public string Text
    {
        get{ return myLabel.Text; }
        set{ myLabel.Text = value; }
    }
}

class UserControl2 : UserControl
{
    private UserControl1 uc1;

    public UserControl2( UserControl1 uc1 ) { this.uc1 = uc1; }

    public void Button_Click( object sender, EventArgs e ) { uc1.Text = "Blaat"; }
}


Het is echter netter om te werken met iets als een MVC pattern. Je hebt hierbij een Model en View ( en Controller ). Je View is een weergave van je Model. Je View gaat ( door middel van een Controller ) een wijziging maken aan je Model.
Als je daarna je andere View weer bekijkt zou deze de huidige staat van je Model moeten weergeven.

[ Voor 35% gewijzigd door Woy op 20-12-2007 17:02 . Reden: simpel code voorbeeld toegevoegd ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 01:56
Verwijderd schreef op donderdag 20 december 2007 @ 16:57:
[...]


Ik snap jouw voorbeeld even niet.
In mijn geval staat die button juist op UserControl2 en die TextBox die een Text moet krijgen op UserControl1.
Andersom dan... :) (Voorbeeld even aangepast...)

Roomba E5 te koop


Verwijderd

Topicstarter
sig69 schreef op donderdag 20 december 2007 @ 17:04:
[...]

Andersom dan... :) (Voorbeeld even aangepast...)
:( Misschien ligt het aan mijn lange dag, maar ik komt er echt niet uit.

Ik snap niet wat je met dit bedoelt:
C#:
1
2
3
4
public class Args : EventArgs
  {
    // Jou fields etc
  } 


Ik snap het sowieso niet. Wat doe ik nu in het mainForm? Ik word gek van mezelf! Grrrrr 8)7

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op donderdag 20 december 2007 @ 18:04:
[...]


:( Misschien ligt het aan mijn lange dag, maar ik komt er echt niet uit.

Ik snap niet wat je met dit bedoelt:
C#:
1
2
3
4
public class Args : EventArgs
  {
    // Jou fields etc
  } 


Ik snap het sowieso niet. Wat doe ik nu in het mainForm? Ik word gek van mezelf! Grrrrr 8)7
Een event heeft standaard twee parameters ( volgens de MS standaard, je kan het natuurlijk altijd zelf anders doen ). De eerste is de sender, de 2e is een class die erft van EventArgs. die parameter is een container voor parameters die met het event te maken hebben.

bij het stukje "Jou fields etc" kun je dus zelf fields declareren die je bij het aanroepen vult. De event handler kan dan aan de hand van deze fields een actie uitvoeren. Als je geen belangrijke data hebt die bij het event horen kun je gewoon de standaar EventArgs gebruiken en EventArgs.Empty meegeven.

NFI maar mischien is het handig om een goed boek te kopen of om een cursus te volgen, want ik krijg het idee dat je nog niet echt een idee hebt waar je mee bezig bent

[ Voor 7% gewijzigd door Woy op 20-12-2007 19:41 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op donderdag 20 december 2007 @ 19:40:


NFI maar mischien is het handig om een goed boek te kopen of om een cursus te volgen, want ik krijg het idee dat je nog niet echt een idee hebt waar je mee bezig bent
Nou, ik heb hier 2 boeken liggen... 1 van 600 pagina's en 1 van 1000, dus neem van mij aan dat ik genoeg uren studeer.
Maar soms is het zo dat ik het echt even niet meer weet. En EventHandlers zijn daar een onderdeel van. Dus ik werk er hard aan om dat te leren en heeeeeeeeeel soms heb ik daar jullie hulp bij nodig.

Maar toch bedankt voor je uitleg.

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024

CMG

Ik heb ff een voorbeeldje gebaseerd op events in elkaar gezet voor je. Zie http://www.nickkusters.com/downloads/Events_and_Controls.zip

Het valt me nu pas op dat alles hier in C# staat, heb je genoeg aan dit vb.net voorbeeld, of moet het specifiek in C# gedaan worden (aangezien events hier via een delegate werken)? Laat het maar ff weten, dan zet ik het morgen anders wel ff om in C# voor je.

[ Voor 49% gewijzigd door CMG op 21-12-2007 00:34 ]

NKCSS - Projects - YouTube


Verwijderd

Topicstarter
CMG schreef op vrijdag 21 december 2007 @ 00:29:
Ik heb ff een voorbeeldje gebaseerd op events in elkaar gezet voor je. Zie http://www.nickkusters.com/downloads/Events_and_Controls.zip

Het valt me nu pas op dat alles hier in C# staat, heb je genoeg aan dit vb.net voorbeeld, of moet het specifiek in C# gedaan worden (aangezien events hier via een delegate werken)? Laat het maar ff weten, dan zet ik het morgen anders wel ff om in C# voor je.
Bedankt voor je voorbeeld.
Ik zie nu wat er gebeurt en ik ga hem zelf proberen om te bouwen naar C#.

Verwijderd

Topicstarter
CMG schreef op vrijdag 21 december 2007 @ 00:29:

Het valt me nu pas op dat alles hier in C# staat, heb je genoeg aan dit vb.net voorbeeld, of moet het specifiek in C# gedaan worden (aangezien events hier via een delegate werken)? Laat het maar ff weten, dan zet ik het morgen anders wel ff om in C# voor je.
Zou je hem toch even om kunnen zetten naar C#? _/-\o_
Die VB syntax kan ik soms maar moeilijk rijmen met de C# syntax.

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024

CMG

Ok, staat op http://www.nickkusters.co...ontrols_VB_AND_CSharp.zip

Heb een DefaultEvent meta attribute toegevoegd en code gegenereerd door te dubbelklikken op de control, als je de eventhandler registratie wilt zien, moet je ff in de designer zijn. Als je de controls dynamisch wilt toevoegen, kun je daar zien hoe het moet. Als je nog hulp nodig hebt hoor ik het wel (i.v.m. de kleine hoeveelheid code acht ik comments niet noodzakelijk aangezien het redelijk voor zich spreekt. Als je hier toch behoefte aan heb, hoor ik het wel).

Veel Success,


Nick Kusters.

NKCSS - Projects - YouTube


Verwijderd

Topicstarter
Mijn dank is groot! :*)

Ik heb nu eindelijk door wat er gebeurt en heb ondertussen mijn eigen code zo gemaakt dat alles dynamisch is. Ik liep vast op het deel bij het "luisteren" naar het event in ucOne via het mainForm.
Ik ga nog maar eens wat oefenen met events.

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024

CMG

Verwijderd schreef op zaterdag 22 december 2007 @ 09:02:
Mijn dank is groot! :*)

Ik heb nu eindelijk door wat er gebeurt en heb ondertussen mijn eigen code zo gemaakt dat alles dynamisch is. Ik liep vast op het deel bij het "luisteren" naar het event in ucOne via het mainForm.
Ik ga nog maar eens wat oefenen met events.
NP, glad to help :)

NKCSS - Projects - YouTube

Pagina: 1