Tekstbox uitlezen vanuit een ander form.

Status
Niet open voor verdere reacties.

PatrickMiah

Gebruiker
Lid geworden
19 feb 2007
Berichten
221
Hallo allemaal,

Ik heb een form die heet frmMainPmia en daarin zit een textbox genaamd txtLogoPathPmia.
Deze textbox wil ik uitlezen in een ander form genaamd frmLogPmia.
Ik wil dus bereiken dat de text in de textbox txtLogoPathPmia in frmMainPmia, naar rtbLogPmia wordt weggeschreven.

Ik heb in frmMainPmia de volgende code getypt:
public string TextBoxValue
{
get { return txtLogoPathPmia.Text; }
set { txtLogoPathPmia.Text = value; }
}

En in frmLogPmia heb ik deze code getypt:
private void Form3_Load(object sender, EventArgs e)
{
rtbLogPmia.Text = "Uw voorbeeld wordt gegenereerd. Een ogenblik geduld alstublieft...\nDe locatie van het logo wordt gecontroleerd... \nDe locatie van het logo is: ";
frmMainPmia form1 = new frmMainPmia();
rtbLogPmia.Text = rtbLogPmia.Text + form1.TextBoxValue;
}

Ik heb de modifiers van txtLogoPathPmia op Public gezet.
Op deze manier krijg ik in ieder geval niets te zien, ook geen foutmelding.

Ik hoop dat het duidelijk is wat ik bedoel. Zo niet, dan probeer ik het beter te formuleren.
Alle hulp is welkom!

Bedankt,

Patrick Miah
 
Je maakt een nieuw frmMainPmia aan en dan wil je meteen de waarde in de textbox weten, deze zal leeg zijn tenzij je deze een begin waarde hebt gegeven in de designer of form constructer.

De textbox zelf hoef je niet op public te zetten, zou ik zeker ook afraden.
 
Vraagje voor ik de oplossing kan geven.
Welk form is er het eerste?

Ik denk zelf 'frmMainPmia' er eerst is en dan kan je via een knop 'frmLogPmia' laten zien.
Als dit zo is dan kan je de code een beetje aanpassen en het zou moeten werken:

Code:
//frmMainPmia
public string TextBoxValue
{
   get { return txtLogoPathPmia.Text; }
   set { txtLogoPathPmia.Text = value; }
} 

///frmLogPmia
private frmMainPmia frmCopy;
public frmLogPmia(frmMainPmia mainForm)
{
   frmCopy = mainFrom;
}

private void Form3_Load(object sender, EventArgs e)
{
   rtbLogPmia.Text = "Uw voorbeeld wordt gegenereerd. Een ogenblik geduld alstublieft...\nDe locatie van het logo wordt gecontroleerd... \nDe locatie van het logo is: ";
   rtbLogPmia.Text = rtbLogPmia.Text + frmCopy.TextBoxValue;
}

Dit zou moeten werken.

Veel succes!
 
Bedankt voor jullie reacties!
frmMainPmia is inderdaad het eerste form en frmLogPmia wordt ook geopend met een button maar helaas werkt jou oplossing niet. Ik krijg geen foutmelding of waarschuwing maar verder komt de tekst van de textbox er ook niet te staan. Is er misschien nog een andere oplossing?
 
Laatst bewerkt:
Het zou veel mooier zijn als ik iets kon doen als:
Code:
rtbLogPmia.Text = rtbLogPmia.Text + frmMainPmia.txtLogoPathPmia.Text;
Jammer dat dit niet werkt.
 
De oplossing van MatthiWare hoort toch echt te werken. Hoe gebruik je het? (Hoe haal je die tekst op?)
 
Waarschijnlijk heeft hij een 2de constructor gemaakt, en blijft hij in de code met de oude werke zonder de extra parameter.
Kan je eventjes nakijken of je bij de code van de button wel deze gebruikt:
Code:
frmLogPmia frm = new frmLogPmia(this); // we vullen 'this' in de argument omdat this hier de frmMainPmia.
en niet:
Code:
frmLogPmia frm = new frmLogPmia(this); // Hier geven we geen argument en gebruik je waarschijnlijk nog de door de IDE zelf gemaakt constructor.

Heb nog een foutje in mijn code van de vorige post gezien. We zijn de InitializeComponent(); vergeten
Code:
public frmLogPmia(frmMainPmia mainForm)
{
   frmCopy = mainFrom;
   InitializeComponent();
}

EDIT: Maar dan zou hij toch een NullReferenceException krijgen dus dat kan het ook niet zijn.


Verder zou ik het ook niet weten. Je kan altijd je volledige project uploaden maakt het voor ons ook stukje gemakkelijker ^^
 
Er zijn veel mogelijkheden om data uit een ander form the halen.
bv: op deze manier gebruik je events om form1 te laten weten dat (in dit geval text) er iets is gewijzigd op form 2
form1: read-only box, form2: edit text box

Dit is maar een voorbeeld wat je zou kunnen uitbreiden door eigen event args mee te sturen, zo hoef je niet de sender te casten naar form2 en is het niet nodig om een public getter voor textbox content te maken.

2l9poxd.png


Code:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnEdit_Click(object sender, EventArgs e)
        {
            var form2 = new Form2(txtReadOnlyInput.Text);
            form2.InputChanged += new EventHandler(form2_InputChanged);
            form2.ShowDialog();
            form2.Dispose();
        }

        void form2_InputChanged(object sender, EventArgs e)
        {
            string input = ((Form2)sender).Input;
            txtReadOnlyInput.Text = input;
        }
    }


Code:
    public partial class Form2 : Form
    {
        public string Input
        {
            get { return txtInput.Text; }
        }

        public Form2(string startInput)
        {
            InitializeComponent();
            txtInput.Text = startInput;
        }

        private void txtInput_TextChanged(object sender, EventArgs e)
        {
            OnInputChanged();
        }

        public event EventHandler InputChanged;

        private void OnInputChanged()
        {
            EventHandler handler = InputChanged;

            if (handler != null) 
                handler(this, EventArgs.Empty);
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
 
Definieer de form die je wilt benaderen in de class "Program" en maak deze statisch. Verander dan op het form dat je wilt benaderen de property "Modifiers" van het control dat je wilt hebben naar "Public". Nu kan je de control op het form aanroepen via de statische Program class.

Waar je nu wel op moet letten is dat wanneer je het form gaat gebruiken je het moet openen via de statische class Program en dat je niet een 2e form aanmaakt.
 
Laatst bewerkt:
Als je dat wilt kun je beter een Singleton form maken, met een private constructer kun je ook niet een nieuw 2e form aanmaken buiten de class.

Code:
    public partial class SingleForm : Form
    {
        private static SingleForm _form;

        private SingleForm()
        {
            InitializeComponent();
        }

        public static SingleForm GetInstance()
        {
            if (_form == null)
                _form = new SingleForm();

            return _form;
        }
    }

vervolgens gewoon bv:

Code:
SingleForm.GetInstance().Show();
 
Hey jongens,

Bedankt voor al jullie hulp. Het is gelukt!

Groetjes Patrick
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan