Handelingen tussen meerdere forms

Status
Niet open voor verdere reacties.

Quindoo

Gebruiker
Lid geworden
27 mei 2009
Berichten
52
Hey Helpmij,

Ik ben bezig aan een applicatie waarin ik nu een main scherm heb en enkele user controls die ingeladen worden in een panel op het main scherm.

Nu heb ik op deze user controls handelingen staan die te maken krijgen met handelingen van het main scherm maar ik vraag mij af hoe ik die moet koppelen. Dus om mijn verhaal een beetje te verduidelijken :

Main scherm bevat een panel waarin bijvoorbeeld een usercontrol in wordt geladen die bijvoorbeeld een rekenmachine bevat. Nu wil ik dus bijvoorbeeld het resultaat van de rekenmachine laten zien op bijvoorbeeld een label op het main scherm.

Dus ik dacht zelf aan iets simpels zoals. Mainscherm.Label1.Text = ... maar zo simpel is het dus niet. Iemand enig idee hoe ik dus zo'n handeling op een ander form / user control kan laten werken.

Met vriendelijke groet,

Quindoo
 
In de constructor van je usercontrol geef je een referentie door van je form

vb:

Neem dat je form 'frmMain' noemt en je usercontrol 'mijnUC'.

In de usercontrol code verander je:

Code:
public mijnUC()
{
    InitializeComponent();
    'hier staat er wss nog code
}

naar:

Code:
private frmMain currentForm;

public mijnUC(frmMain form)
{
    InitializeComponent();
    currentForm = form;
    'hier staat er wss nog code
}

je kan dan het form aanspreken door:

Code:
currentForm.label1.Text = "test";

en als je de usercontrol inlaadt, verander je:

Code:
panel1.Controls.Add(new mijnUC());

naar:

Code:
panel1.Controls.Add(new mijnUC(this));
 
Ik heb jouw antwoord stap voor stap gevolgd en de usercontrol code en het inladen van de usercontrols werkt nou volgens mij. Alleen als ik het form wil aanspreken dan krijg ik de volgende foutmelding:

Code:
'SmartDeviceProject1.Form1.btn_menu_ober' is inaccessible due to its protection level

maar ik heb wel het volgende goed aangepast volgens mij:

codes uit mijn usercontrol:
Code:
        private Form1 currentForm;
        public UC_Instellingen(Form1 form)
        {
            InitializeComponent();
            currentForm = form;
Code:
currentForm.btn_menu_ober.Visible = true;

codes uit mijn form:
Code:
pnl_content.Controls.Clear();
           pnl_content.Controls.Add(new UC_Instellingen(this));

Heb ik dan toch iets verkeerds gedaan?
Of werkt jouw oplossing alleen voor labels en/of teksten?

Met vriendelijke groet,

Quindoo
 
Laatst bewerkt:
C# zet alle buttons e.d. op private wanneer hij deze aanmaakt en is het dus onmogelijk om
deze te wijzigen vanuit een andere usercontrol of form.

Om de dingen aan te passen (wss caption en text) maak je best een public methode in je form.
Je kan dan die aanroepen vanuit je usercontrol.

bv om de caption van je button aan te passen:
Code:
public setBtnMenuOberText(string s)
{
     btn_menu_ober.Text = s;
}

Dit is de veiligste en gemakkelijkste manier (als je niet met multithreading gaat werken)
 
Ik heb geprobeerd om jouw code te kopieren maar daar kreeg mijn project enkele foutmeldingen bij. Maar door de oplossing te lezen ben ik erachter gekomen dat ik inderdaad de label bij mijn Form1.Designer.cs op public moest zetten.

Hierdoor werken de handelingen tussen de forms nu iig maar is dit nu een onveilige manier door alleen de private naar public te veranderen? Het moet namelijk gebruikt worden in restaurants als touch screen.

Met vriendelijke groet,

Quindoo
 
Het is pas onveilig als de code dient om andere te laten mee werken. Zo heb
je meer controle over wat ze mogen aanspreken en wat niet. Het is ook onveilig
als er mensen in het geheugen zouden gaan beginnen aanpassen, maar dat
lijkt mij sterk onwaarschijnlijk. Ik zou mij geen zorgen maken (in dit geval) over het public zetten
van controls.
 
Sorry dat ik nog even stoor hoor, maar aangezien het nog over hetzelfde onderwerp gaat, zou ik het hier nog even kwijt willen:

Ik heb de koppelingen tussen UserControls en mijn Form werkend gekregen maar nu loop ik tegen een andere probleem aan. Ik heb namelijk enkele handelingen die tussen twee UserControls gaan maar dus ook op het Form worden weergegeven.

Nu dacht ik zoiets als dezelfde code te gebruiken maar dan ipv currentForm een tweede maken zoals hieronder:

Code:
private Form1 currentForm;
        public UC_Instellingen(Form1 form)
        {
            InitializeComponent();
            currentForm = form;

        private UC_Producten productenForm;
        public UC_Instellingen(UC_Producten form2)
        {
            InitializeComponent();
            productenForm = form2;

maar zoiets geeft een foutmelding, weet niet meer precies welke, dus heb ik nog een tweede manier geprobeerd en das om het zo te doen maar dit werkte ook niet helemaal:

Code:
private Form1 currentForm;
           private UC_Producten productenForm;
        public UC_Instellingen(Form1 form)
        {
            InitializeComponent();
            productenForm = form2;
            currentForm = form;

Enig idee?

Met vriendelijke groet,

Quindoo
 
Je maakt 2 constructors aan. Je kan er maar 1 gebruiken om je object aan te maken, dus
moet je het form en de usercontrol meegeven in 1 constructor:

Code:
        private Form1 currentForm;
        private UC_Producten productenForm;

        public UC_Instellingen(Form1 form, UC_Producten form2)
        {
            InitializeComponent();
            currentForm = form;
            productenForm = form2;
        }
 
Ja zoiets dacht ik al, maar zodra ik jouw tekst gebruik krijg ik ineens overal foutmeldingen bij de teksten waar die UC_Aantal opvraagt, en dit komt dus nadat ik zo'n tweede verwijzing toevoeg zoals jouw voorbeeld. Als ik dat weer terugzet doet alles het weer.

Want ik zit nu in zo'n situatie:

Scherm = mainscherm en bestaat uit 2 panels waar UserControls in komen.
UC_Rekening komt in de ene panel
UC_Aantal, UC_Instellingen etc komt allemaal in de andere panel

en de tekst heb ik nu toegevoegd bij degene die meerdere verwijzingen moet krijgen, in mijn geval dus

UC_Aantal want die verwijst dus naar Scherm en UC_Rekening.

Code:
Error	1	'SmartDeviceProject1.UC_Rekening' does not contain a constructor that takes '1' arguments	C:\Documents and Settings\Administrator\Desktop\Programmeren\SmartDeviceProject2\SmartDeviceProject1\Scherm.cs	32	38	SmartDeviceProject1
 
Laatst bewerkt:
Je kan dit doen:

Gewoon een verwijzing naar jou form doorgeven en dan elke keer een verwijzing maken
als ze nodig is:

Code:
public Form1 currentForm {get; set;}
public UC_Producten productenForm {get; set;}
public UC_Aantal aantalForm {get; set;}
//...

public UC_Instellingen(Form1 form)
{
     InitializeComponent();
     currentForm = form;
}

en dan kan je als je de verwijzing wilt toevoegen (bvb voor aantal):
dit is natuurlijk maar een voorbeeld hé (de laatste regel is de belangrijkste).

Code:
UC_Aantal aantal = new UC_Aantal(this);
UC_Instellingen instellingen = new UC_Instellingen(this);
instellingen.aantalForm = aantal;
 
Sorry hoor maar nu snap ik er helemaal niks meer van.

Ik heb nu dit staan:

Code:
namespace SmartDeviceProject1
{
    public partial class UC_Aantal : UserControl
    {
        public Scherm currentForm { get; set; }
        public UC_Rekening rekeningForm { get; set; }
        public UC_Aantal aantalForm { get; set; }

        public UC_Aantal(Scherm form, UC_Rekening form2)
        {
            InitializeComponent();
            currentForm = form;
            rekeningForm = form2;
        }

als mijn constructor voor UC_Aantal

maar nu krijg ik nog steeds bij al die andere UserControls de foutmeldingen bij UC_Aantal namelijk:

Code:
Error	1	'SmartDeviceProject1.UC_Aantal' does not contain a constructor that takes '1' arguments	C:\Documents and Settings\Administrator\Desktop\Programmeren\SmartDeviceProject2\SmartDeviceProject1\Scherm.cs	22	38	SmartDeviceProject1

Maar ik wil gewoon zoiets krijgen net als dat ik eerst kon doen tussen usercontrols en mijn Scherm ( hoofdform ):

Code:
tbx_aantal_scherm.Text = rekeningForm.lbl_geselecteerd_aantal.Text;

Dus dat de text van de textbox op UC_Aantal over gezet wordt naar de textbox op UC_Rekening, maar het moet ook nog steeds geladen kunnen worden in mijn panel van Scherm.
 
Hier zit de fout:

Code:
[COLOR="Red"]public UC_Aantal(Scherm form)[/COLOR]
        {
            InitializeComponent();
            currentForm = form;
        }

en per verschillende usercontrol plaats je zo een lijntje:

Code:
public UC_Producten productenForm { get; set; }

en dan kan je die meegeven als het wordt aangemaakt.

Stel:

Je maakt een nieuwe UC_Producten aan in je form en je noemt het (producten).
Je wilt dat nu meegeven aan je UC_Instellingen (genaamd, instellingen).
(Daarvoor zijn bovenstaande lijntjes voor) Je zet dan de volgende code waar de
UC_Producten wordt aangemaakt:

Code:
instellingen.productenForm = producten;

Als je het nog niet snapt ... post je nog maar eens ;)
 
Ik begin hem denk ik te snappen alleen bedoel je met en per verschillende usercontrol plaats je zo een lijntje dat ik dus elke UserControl moet aangeven zoals ik nu hieronder heb gedaan?

Code:
public partial class UC_Aantal : UserControl
    {
        public Scherm currentForm { get; set; }
        public UC_Aanmelden aanmeldenForm { get; set; }
        public UC_Aantal aantalForm { get; set; }
        public UC_Artikelen artikelenForm { get; set; }
        public UC_Groepen groepenForm { get; set; }
        public UC_Hoofdgroepen hoofdgroepenForm { get; set; }
        public UC_Instellingen instellingenForm { get; set; }
        public UC_Rekening rekeningForm { get; set; }
        
        public UC_Aantal(Scherm form)
        {
            InitializeComponent();
            currentForm = form;
        }

en als button event heb ik dit nu:

Code:
private void btn_aantal_bestellen_Click(object sender, EventArgs e)
        {
            aantalForm.tbx_aantal_scherm.Text = rekeningForm.lbl_geselecteerd_aantal.Text;
        }

Hij runt hem nu dus wel zonder fouten maar zodra ik nu op deze knop klik in mijn applicatie geeft die een fout aan 'Unhandled exception has occured in your application. If you click Continue...'
 
Die 2 dingen die gedaan hebt, zijn goed, maar die lijntjes moeten enkel in uw UC_Rekening komen (uitgezonderd van zichzelf)!

Code:
public Scherm currentForm { get; set; }
public UC_Aanmelden aanmeldenForm { get; set; }
public UC_Aantal aantalForm { get; set; }
public UC_Artikelen artikelenForm { get; set; }
public UC_Groepen groepenForm { get; set; }
public UC_Hoofdgroepen hoofdgroepenForm { get; set; }
public UC_Instellingen instellingenForm { get; set; }

Voor het gemak zou je beter het volgende doen in UC_Rekening. Je past de constructor aan en die wordt dan:

Code:
        public UC_Rekening(Scherm form)
        {
            InitializeComponent();
            currentForm = form;

            aantalForm = new aantalForm(currentForm, this);
            aanmeldenForm = new aanmeldenForm(currentForm, this)
            artikelenForm = new artikelenForm(currentForm, this);
            groepenForm = new groepenForm(currentForm, this);
            hoofdgroepenForm = new hoofdgroepenForm(currentForm, this);
            instellingenForm = new instellingenForm(currentForm, this);           
        }

In alle andere usercontrols moeten er enkel de volgende 2 lijntjes:

Code:
public Scherm currentForm { get; set; }
public UC_Rekening rekeningForm { get; set; }

en de constructor van al de andere usercontrols moet er zo uit
zien (vergeet de naam niet aan te passen hé) bvb voor UC_Aantal:

Code:
        public UC_Aantal(Scherm form, UC_Rekening form2)
        {
            InitializeComponent();
            currentForm = form;
            rekeningForm = form2;
        }

Ook bij je form (Scherm) moet er dit lijntje komen:

Code:
public UC_Rekening rekeningForm { get; set; }

Hoe werk je hier nu mee:

Bij het opstarten van je programma (dus in de constructor van je form (Scherm)) moet je
een nieuwe UC_Rekening aanmaken en tonen in je eerste panel:

Code:
        public Scherm()
        {
            InitializeComponent();
            rekeningForm = new UC_Rekening(this);
            panel1.Controls.Add(rekeningForm);
        }

Hoe toon je nu de controls in panel2?

Stel dat je een knop 'btnInstellingen' hebt die het UC_Instellingen moet toevoegen in je panel2,
dan zet je in het click-event van die button de volgende code:

Code:
panel2.Controls.Clear();
panel2.Controls.Add(rekeningForm.instellingenForm);

Jouw button-event moet ook worden aangepast. Je moet 'this' gebruiken ipv aantalForm, vermits je in die control zelf bezig bent.

Any Questions :)?
 
Oke heb nu alles van jouw gebruikt en kwam nog op enkele foutmeldingen na, maar na wat *****n ben ik erachter gekomen dat de uiteindelijke code van UC_Rekening het volgende moest worden:

Code:
        public Scherm currentForm { get; set; }
        public UC_Aanmelden aanmeldenForm { get; set; }
        public UC_Aantal aantalForm { get; set; }
        public UC_Artikelen artikelenForm { get; set; }
        public UC_Groepen groepenForm { get; set; }
        public UC_Hoofdgroepen hoofdgroepenForm { get; set; }
        public UC_Instellingen instellingenForm { get; set; }
        
        public UC_Rekening(Scherm form)
        {
            InitializeComponent();
            currentForm = form;

            aantalForm = new UC_Aantal(currentForm, this);
            aanmeldenForm = new UC_Aanmelden(currentForm, this);
            artikelenForm = new UC_Artikelen(currentForm, this);
            groepenForm = new UC_Groepen(currentForm, this);
            hoofdgroepenForm = new UC_Hoofdgroepen(currentForm, this);
            instellingenForm = new UC_Instellingen(currentForm, this);
        }

want in jouw code stond aantalForm = new aantalForm(currentForm, this); ofzoiets, maar dat gaf die nog als fout aan.

Maar het werkt in ieder geval nu, kan dus nu alle usercontrols inladen op me pnl_content en de UC_Rekening op me pnl_rekening en de connecties tussen tot nu toe UC_Aantal en UC_Rekening werkt ook nou dus hartstikke bestankt en ook bedankt voor de snelle reacties.

Misschien nog een klein vraagje:

Het werkt nu wel maar ik begrijp eigenlijk niet waarom alles zo moet staan:

Code:
pnl_content.Controls.Clear();
pnl_content.Controls.Add(rekeningForm.instellingenForm);

Want die rekeningForm doet toch eigenlijk niks tussen de koppelingen van de UserControls en pnl_content? dus waarom dan toch overal beginnen met rekeningForm..?

Met vriendelijke groet,

Quindoo
 
want in jouw code stond aantalForm = new aantalForm(currentForm, this); ofzoiets, maar dat gaf die nog als fout aan.

Je hebt gelijk ... grote fout van mij :eek:!

Misschien nog een klein vraagje:

Het werkt nu wel maar ik begrijp eigenlijk niet waarom alles zo moet staan:

Code:
pnl_content.Controls.Clear();
pnl_content.Controls.Add(rekeningForm.instellingenForm);
Want die rekeningForm doet toch eigenlijk niks tussen de koppelingen van de UserControls en pnl_content? dus waarom dan toch overal beginnen met rekeningForm..?

Die rekeningForm doet alle koppelingen tussen UserControls.
Je hebt van elke mogelijke usercontrol een instantie aangemaakt in UC_Rekeningen (zie contructor). Dus kan je die gebruiken om ze toe te voegen aan je panel.

Neem bvb dat je de tekst van een textbox van UC_Aantal wilt doorsluizen naar UC_Instellingen (louter als voorbeeld hé), dan moet je in je form (Scherm):

Code:
rekeningenForm.instellingenForm.textbox1.Text = rekeningenForm.aantalForm.textbox1.Text;
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan