Probleem met de toegankelijkheid van een ListBox.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • MasterTweaker
  • Registratie: Maart 2010
  • Laatst online: 12-09 18:01
Ik ben met een klein programmaatje bezig wat bestaat uit twee windows forms waarin ik een probleem heb met de toegankelijkheid van een listbox. (Alle twee de Windows forms zijn aparte projecten binnen dezelfde solution explorer. Dit omdat het tweede formulier een proces is die aangeroepen wordt vanaf het eerste formulier.)

Ik heb namelijk een Listbox waarin gegevens geladen zijn die staat op Form1. Maar nu wil ik door op een knop te drukken in Form2 de gegevens in de ListBox veranderen.

Alleen nu is het probleem dat ik de ListBox niet kan benoemen in het tweede formulier omdat de ListBox niet "gedeclareerd" is. Dan krijg je dus dit te zien:
Afbeeldingslocatie: http://i42.tinypic.com/2cdk8p1.jpg

Nu wil ik dus dat ListBox1 ook op Form2 te gebruiken is zonder een globale variabele te definiëren. Ik kan nu dus niet simpelweg zeggen form1.Listbox1....... aangezien ik twee projecten gebruik binnen eenzelfde solution. Dit kan alleen als je 1 project hebt in een solution explorer met in dat project twee formulieren.

Weet iemand hoe ik dit kan oplossen? Ik weet niet of jullie hiervoor de code nodig hebben maar mocht dit het geval zijn dan post ik de code.

Acties:
  • 0 Henk 'm!

  • Mint
  • Registratie: Mei 2005
  • Laatst online: 22:03
Misschien een nieuwe class aanmaken met een private list, waar beide forms gebruik van kunnen maken?

Acties:
  • 0 Henk 'm!

  • marco_balk
  • Registratie: April 2001
  • Laatst online: 20-06 21:52
Tja, daar zijn verschillende mogelijkheden voor.
Wellicht staat er iets voor jij bij in de zoekresultaten.
adyta schreef op dinsdag 20 april 2010 @ 11:54:
Misschien een nieuwe class aanmaken met een private list, waar beide forms gebruik van kunnen maken?
Dat is minder netjes, IMHO. Je kan het object gewoon publiekelijk toegankelijk maken met Properties en Form1 met Form2 laten communiceren.

[ Voor 42% gewijzigd door marco_balk op 20-04-2010 11:56 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het is heel eenvoudig, en nogal basic.

Je moet gewoon zorgen dat je een referentie naar je Listbox beschikbaar hebt, of een methode ( via je form bijvoorbeeld ) exposed zodat je de text kan wijzigen.

Definieer in Form1 bijvoorbeeld iets van een methode als
C#:
1
2
3
void DoSomeWithListBox( string input ) {
    listbox1.FindString(input);
}

Als je dan in Form2 een referentie hebt naar je Form1 waar je wat wilt wijzigen kun je gewoon die methode aanroepen. Je kunt natuurlijk ook gewoon je Listbox via een property exposen, of gewoon de modifier op public zetten, maar het is beter om de daadwerkelijke representatie gescheiden te houden van het gedrag. Als je laten op Form1 bijvoorbeeld geen listbox meer zet, maar een ander control die hetzelfde representeerd, hoef je dat met een methode alleen maar in Form1 aan te passen, en niet overal waar je die Listbox gebruikt

“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.”


Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

Als je zo'n simpel progje maakt, waarom dan de keus voor 2 projecten binnen 1 solution?

2 Classes binnen 1 solution ligt namelijk een stuk meer voor de hand :) (logischer, simpeler)

[ Voor 10% gewijzigd door YakuzA op 20-04-2010 12:22 ]

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


Acties:
  • 0 Henk 'm!

  • MasterTweaker
  • Registratie: Maart 2010
  • Laatst online: 12-09 18:01
Woy schreef op dinsdag 20 april 2010 @ 11:59:
Het is heel eenvoudig, en nogal basic.

Je moet gewoon zorgen dat je een referentie naar je Listbox beschikbaar hebt, of een methode ( via je form bijvoorbeeld ) exposed zodat je de text kan wijzigen.

Definieer in Form1 bijvoorbeeld iets van een methode als
C#:
1
2
3
void DoSomeWithListBox( string input ) {
    listbox1.FindString(input);
}

Als je dan in Form2 een referentie hebt naar je Form1 waar je wat wilt wijzigen kun je gewoon die methode aanroepen. Je kunt natuurlijk ook gewoon je Listbox via een property exposen, of gewoon de modifier op public zetten, maar het is beter om de daadwerkelijke representatie gescheiden te houden van het gedrag. Als je laten op Form1 bijvoorbeeld geen listbox meer zet, maar een ander control die hetzelfde representeerd, hoef je dat met een methode alleen maar in Form1 aan te passen, en niet overal waar je die Listbox gebruikt
Oke thnx ik heb nu op het eerste formulier ( waarop de listbox staat ), een methode aangemaakt die de wijziging uitvoert. Deze methode roep ik nu op het tweede formulier aan maar dan krijg ik dus nog steeds dat form2 deze methode niet herkent. Ik krijg dan de volgende melding: "changelistbox() is not declared"

Hoe maak je het dan zo dat deze methode toegankelijk is voor form2?
:)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MasterTweaker schreef op dinsdag 20 april 2010 @ 12:25:
[...]
Hoe maak je het dan zo dat deze methode toegankelijk is voor form2?
Zorgen dat je een referentie naar form1 hebt, en zorgen dat de access modifier van de methode goed staat.

“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.”


Acties:
  • 0 Henk 'm!

  • MasterTweaker
  • Registratie: Maart 2010
  • Laatst online: 12-09 18:01
Woy schreef op dinsdag 20 april 2010 @ 13:50:
[...]

Zorgen dat je een referentie naar form1 hebt, en zorgen dat de access modifier van de methode goed staat.
Ik heb nu een referentie naar form 1 maar ook form 1 wordt niet herkend in het project.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:07

Haan

dotnetter

MasterTweaker schreef op dinsdag 20 april 2010 @ 14:23:
[...]

Ik heb nu een referentie naar form 1 maar ook form 1 wordt niet herkend in het project.
Dus dan heb je geen referentie naar form1.. Wat heb je gedaan? Zijn de benodigde elementen wel Public?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
"word niet herkend" is nogal een vage omschrijving. Heb je in het project waar Form2 in is gedefinieerd wel een reference naar het project waar Form1 in is gedefinieerd?

Hoe kan je een reference hebben naar een object wat "niet herkend" word?

Laat eens een paar kleine stukjes relevante code zien. Dus hoe je Form1 en Form2 instantieerd, en hoe je de methode probeert aan te roepen, en beschrijf eens duidelijk wat daar niet mee wil lukken.

“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.”


Acties:
  • 0 Henk 'm!

  • MasterTweaker
  • Registratie: Maart 2010
  • Laatst online: 12-09 18:01
Woy schreef op dinsdag 20 april 2010 @ 14:27:
"word niet herkend" is nogal een vage omschrijving. Heb je in het project waar Form2 in is gedefinieerd wel een reference naar het project waar Form1 in is gedefinieerd?

Hoe kan je een reference hebben naar een object wat "niet herkend" word?

Laat eens een paar kleine stukjes relevante code zien. Dus hoe je Form1 en Form2 instantieerd, en hoe je de methode probeert aan te roepen, en beschrijf eens duidelijk wat daar niet mee wil lukken.
In form2 heb ik nu het volgende geplaatst:
Public myForm As New Form1. Hieronder is de totale code te zien van form2:
code:
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
Imports System.IO
Public Class Form2
    Public myForm As New Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            Dim StreamToDisplay As StreamReader
            StreamToDisplay = New StreamReader("\text.txt")
            TextBox1.Text = StreamToDisplay.ReadToEnd
            StreamToDisplay.Close()
        Catch
            MsgBox("Kan orders.txt niet vinden", MsgBoxStyle.Critical, "Error")
        End Try
    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim sw As StreamWriter = New StreamWriter("\text.txt")
        sw.WriteLine(TextBox1.Text)
        sw.Close()

        myForm.changelistbox()

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        End
    End Sub
End Class

changelistbox() is dus de methode die refereert naar form1 en daar de Listbox update.
Maar goed het probleem is dat form1 niet herkent wordt. :')

[ Voor 47% gewijzigd door MasterTweaker op 20-04-2010 15:40 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:07

Haan

dotnetter

Waarom heb je een class Form2 en een form Form1 8)7

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • MasterTweaker
  • Registratie: Maart 2010
  • Laatst online: 12-09 18:01
Haan schreef op dinsdag 20 april 2010 @ 15:48:
Waarom heb je een class Form2 en een form Form1 8)7
Ik heb twee klassen in het project:
Form1 en Form2.

Maar met form bedoel ik dus de klasse Form1. :)

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Er is een reden waarom je een naam op kan geven als je een nieuwe form aan je project toevoegt. ;) Verder. nogmaals: waarom gebruik je twee projecten voor iets dat in een project moet zitten? :? "Dit omdat het tweede formulier een proces is die aangeroepen wordt vanaf het eerste formulier." is niet alsof je daar geen invloed over hebt; inter-proces communicatie is iets anders dan communicatie binnen een proces. Het zou mooi worden als die boundary opeens wordt overschreden. En nu lijkt het in de code alsof je het toch over één project hebt gezien die new Form1? :?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MasterTweaker schreef op dinsdag 20 april 2010 @ 15:32:
changelistbox() is dus de methode die refereert naar form1 en daar de Listbox update.
Maar goed het probleem is dat form1 niet herkent wordt. :')
"Niet herkend word" is nog steeds te vaag! Krijg je een foutmelding? Als hij het type niet kent, moet je dus gewoon zorgen dat je project een reference naar het project heeft waar dat type in gedefinieerd is.

“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.”


Acties:
  • 0 Henk 'm!

  • MasterTweaker
  • Registratie: Maart 2010
  • Laatst online: 12-09 18:01
Woy schreef op dinsdag 20 april 2010 @ 16:52:
[...]

"Niet herkend word" is nog steeds te vaag! Krijg je een foutmelding? Als hij het type niet kent, moet je dus gewoon zorgen dat je project een reference naar het project heeft waar dat type in gedefinieerd is.
Oke maar hoe doe je dit dan?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Geef nou eerst eens aan wat voor foutmelding je precies krijgt. We zijn nu allemaal gewoon aan het gokken wat er precies mis gaat "Niet herkend worden" is nogal een ruim begrip, waar jij waarschijnlijk gewoon een duidelijke foutmelding krijgt.

Onder elk project heb je zo'n mooi mapje "References", en als je daar op klikt en dan "Add reference" kiest kan je references toevoegen.

Als je niet weet hoe dat werkt, vraag ik me echt serieus af waarom je er uberhaupt voor gekozen hebt om het op te delen in meerdere projecten.

“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.”


Acties:
  • 0 Henk 'm!

  • Ciqniz
  • Registratie: Oktober 2002
  • Laatst online: 07-09-2023

Ciqniz

On the move...

We weten nu in ieder geval dat het om VB.NET gaat :/

Stel je hebt:
- projectA (executable) met form1 met daarop een knop
- projectB (executable) met form2 met daarop een listbox

En:
- de listbox op projectB.form2 moet ververst worden
- de knop op projectA.form1 zorgt hiervoor

Dan moet je (dit is een manier, maar niemand weet wat je echt wilt bereiken, dus je moet er zelf wat moois van maken):
- Knop (Button1 maar ff voor straks) op projectA.form1 modifier property op public zetten
- References openklappen bij ProjectB en daar tabblad Projects openen en ProjectA selecteren
- in de Form2_Load event van ProjectB.Form2 een nieuwe instantie maken van ProjectA.Form1 (ProjectA.Form1 form = new ProjectA.Form1())
- Dan een eventhandler toevoegen aan je ProjectA.Form1.Button1 (de knop dus): form.Button1.Click += intypen en dan krijg je een voorstel om TAB toets te gebruiken (2x TAB gebruiken), dan wordt de rest automatisch aangevuld, is voor jou alleen maar makkelijk.
- Dan form.Show() intypen
- Daarna in je button1_Click eventhandler die in je ProjectB.Form2 staat de code toevoegen dat er een item toegevoegd wordt aan de listbox (kun je nog veel meer mee).

Dit is verre van bruikbaar denk ik in elke normale situatie, maar het is voor jou om in ieder geval een beetje kennis op te doen van werken met dit soort constructies.

O en dit is allemaal met C# kennis in mijn achterhoofd, weet vrijwel niets (meer) van VB.NET, dus sorry als er iets niet helemaal overeenkomt!

Acties:
  • 0 Henk 'm!

  • kunnen
  • Registratie: Februari 2004
  • Niet online
"\test.txt" ga je ook niet kunnen vinden trouwens

Edit: Of is dat in VB nog steeds die vreemde syntaxis waarin \t geen tab betekent?

[ Voor 50% gewijzigd door kunnen op 20-04-2010 23:48 ]


Acties:
  • 0 Henk 'm!

  • Ciqniz
  • Registratie: Oktober 2002
  • Laatst online: 07-09-2023

Ciqniz

On the move...

ThomasB schreef op dinsdag 20 april 2010 @ 23:48:
"\test.txt" ga je ook niet kunnen vinden trouwens

Edit: Of is dat in VB nog steeds die vreemde syntaxis waarin \t geen tab betekent?
Net ff geprobeerd:
VB.NET 3.5:
MessageBox.Show("\toi")

Ik zou verwachten dat de output ([tab]oi zou zijn, maar het is dus gewoon \toi)

:F

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:07

Haan

dotnetter

VB.Net heeft een ControlChars enumeration class met een aantal constant fields voor control chars, vind ik eigenlijk zo gek nog niet. Waarom bijvoorbeeld in C# wel Environment.Newline hebben, maar geen Environment.Tab ?

[ Voor 15% gewijzigd door Haan op 21-04-2010 08:34 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Haan schreef op woensdag 21 april 2010 @ 08:29:
Waarom (..) wel Environment.Newline hebben, maar geen Environment.Tab ?
Omdat een newline wel enviroment afhankelijk is en een tab niet.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Haan schreef op woensdag 21 april 2010 @ 08:29:
Waarom bijvoorbeeld in C# wel Environment.Newline hebben, maar geen Environment.Tab ?
Omdat een newline platform afhankelijk is:
A string containing "\r\n" for non-Unix platforms, or a string containing "\n" for Unix platforms.
een tab niet :Y)
Janoz schreef op woensdag 21 april 2010 @ 09:26:
[...]

Omdat een newline wel enviroment afhankelijk is en een tab niet.
EY! :(

[ Voor 18% gewijzigd door RobIII op 21-04-2010 09:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1