is it save to call functions from another form?

  • Thread starter Thread starter Co
  • Start date Start date
C

Co

Hi All,

I want to call a function from another page.
I've made it Public but still it doesn't recognize it.

called from form frmZoeken:
Explorer1.AddFolder2Database(nodeID, sNewFolder)
Explorer1.TreeView.Refresh()

Marco
 
Co said:
Hi All,

I want to call a function from another page.

A web page or a windows Form?
I've made it Public but still it doesn't recognize it.

The compiler says "...isn't a member of..."?
Or doesn't it find variable 'Explorer1'?
called from form frmZoeken:
Explorer1.AddFolder2Database(nodeID, sNewFolder)
Explorer1.TreeView.Refresh()

What's the declaration of Explorer1? Where is it declared? Does the type of
the variable have the members AddFolder2Database and TreeView? Are they
accessible (Public/Friend if in the same assembly)?


Armin
 
Co said:
Hi All,

I want to call a function from another page.

A web page or a windows Form?
I've made it Public but still it doesn't recognize it.

The compiler says "...isn't a member of..."?
Or doesn't it find variable 'Explorer1'?
called from form frmZoeken:
Explorer1.AddFolder2Database(nodeID, sNewFolder)
Explorer1.TreeView.Refresh()

What's the declaration of Explorer1? Where is it declared? Does the type of
the variable have the members AddFolder2Database and TreeView? Are they
accessible (Public/Friend if in the same assembly)?


Armin
 
A web page or a windows Form?


The compiler says "...isn't a member of..."?
Or doesn't it find variable 'Explorer1'?




What's the declaration of Explorer1? Where is it declared? Does the type of
the variable have the members AddFolder2Database and TreeView? Are they
accessible (Public/Friend if in the same assembly)?

Armin

Armin,

I have been looking at this page but I can't make any sense of it:

http://bytes.com/groups/net-vb/388067-refreshing-main-form-another-form

What I want to do is the following.
I have a mainform called Explorer1 which has a Treeview on it.
Now from the menu I open the search page called: frmZoeken.
On frmZoeken I click a button which creates a new node in the Treeview
of Explorer1 called "New Folder"

So I want the node added and refresh the Treeview so the node is
shown:
Explorer1.AddFolder2Database(nodeID, sNewFolder)
Explorer1.TreeView.Refresh()

With my code the node is added but it doesn't show.

Marco
 
A web page or a windows Form?


The compiler says "...isn't a member of..."?
Or doesn't it find variable 'Explorer1'?




What's the declaration of Explorer1? Where is it declared? Does the type of
the variable have the members AddFolder2Database and TreeView? Are they
accessible (Public/Friend if in the same assembly)?

Armin

Armin,

I have been looking at this page but I can't make any sense of it:

http://bytes.com/groups/net-vb/388067-refreshing-main-form-another-form

What I want to do is the following.
I have a mainform called Explorer1 which has a Treeview on it.
Now from the menu I open the search page called: frmZoeken.
On frmZoeken I click a button which creates a new node in the Treeview
of Explorer1 called "New Folder"

So I want the node added and refresh the Treeview so the node is
shown:
Explorer1.AddFolder2Database(nodeID, sNewFolder)
Explorer1.TreeView.Refresh()

With my code the node is added but it doesn't show.

Marco
 
Co said:
Armin,

I have been looking at this page but I can't make any sense of it:

http://bytes.com/groups/net-vb/388067-refreshing-main-form-another-form

What I want to do is the following.
I have a mainform called Explorer1 which has a Treeview on it.
Now from the menu I open the search page called: frmZoeken.
On frmZoeken I click a button which creates a new node in the Treeview
of Explorer1 called "New Folder"

So I want the node added and refresh the Treeview so the node is
shown:
Explorer1.AddFolder2Database(nodeID, sNewFolder)
Explorer1.TreeView.Refresh()

With my code the node is added but it doesn't show.

You really must be more precize if you expect help from others. Above you
wrote "it doesn't recognize it". Now you write "it doesn't show". I'm gonna
assume the latter. Or, "it doesn't show" via intellisense? I don't know.


Seems to be one of the problems MSFT reintroduced with the reintroduction of
the fatal Form "default instances" they got rid of in VB 2002/2003. Was
meant to make it easier for beginners. Yeah, sure - but it doesn't. I can't
tell you how much I "dislike" these default instances.


I hardly know where to start..., well, the first thing you have to know is
that VB does several things under the hood. This makes it sometimes
complicated to understand how things work. One invisible class it compiles
into your project is called 'MyProject' under the 'My' namespace. For
example, the full name is "WinApplication1.My.MyProject". It's a special
class that we call a Module in VB syntax. In addition, another invisible
class is created. It's called 'MyForms'. It is as a nested class inside
class MyProject. It has one property per Form in the project. Each
property's name is the same name as the Form's class name. Each property
returns an instance of a Form of the corresponding Form type. The module
MyProject has a property called Forms. It is of type MyForms.

Whenever you write:

FormClassName.Member

the VB compiler behaves very special: 'FormClassName' is resolved to
Forms.FormClassName. As 'MyProject' is a Module, the Forms property is
actually a shared member. Consequently, there can be exactly one default
instance of each Form in your project.


So far, so bad. Back to your project. If you write
'Explorer1.AddFolder2Database', you are accessing the default instance of
the Form. Hovering the mouse above 'Explorer1', the IDE is incorrectly
showing "Class Explorer1". Well, it's also a class, but not in this context.
If it was resolved to the class name, you would only be able to access the
shared members. In fact you are able to write

Explorer1.Show

How can this be possible as Explorer1 is a class but Show is an _instance_
member? Actually Explorer1 is a property, but MSFT doesn't want us to know
this and prefers to hide the details.

(Hopefully) coming to the solution: How did you create an instance of Form
Explorer1 that you see on the screen? If you add folders (in
AddFolder2Database) and they don't appear on your visible Form, I guess you
didn't show the default instance but are you adding the items to the default
instance.

BTW, why do you call TreeView.Refresh? (I do have a reason for this question
but will wait for your answer.)


If you don't want to be confused by this intransparent and badly designed
model (namely the whole My.Crap), just add

_mytype="empty"

to the compile constants in your project's properties. I've created a
project template for this. But, don't be surprised if you will have
additional 1001 questions after that. ;-) (No, it would not solve your
problem! - but mine)

See also:
http://msdn.microsoft.com/en-us/library/ms233781.aspx
(anyway, it does not really make things more comprehensive)


Armin
 
Co said:
Armin,

I have been looking at this page but I can't make any sense of it:

http://bytes.com/groups/net-vb/388067-refreshing-main-form-another-form

What I want to do is the following.
I have a mainform called Explorer1 which has a Treeview on it.
Now from the menu I open the search page called: frmZoeken.
On frmZoeken I click a button which creates a new node in the Treeview
of Explorer1 called "New Folder"

So I want the node added and refresh the Treeview so the node is
shown:
Explorer1.AddFolder2Database(nodeID, sNewFolder)
Explorer1.TreeView.Refresh()

With my code the node is added but it doesn't show.

You really must be more precize if you expect help from others. Above you
wrote "it doesn't recognize it". Now you write "it doesn't show". I'm gonna
assume the latter. Or, "it doesn't show" via intellisense? I don't know.


Seems to be one of the problems MSFT reintroduced with the reintroduction of
the fatal Form "default instances" they got rid of in VB 2002/2003. Was
meant to make it easier for beginners. Yeah, sure - but it doesn't. I can't
tell you how much I "dislike" these default instances.


I hardly know where to start..., well, the first thing you have to know is
that VB does several things under the hood. This makes it sometimes
complicated to understand how things work. One invisible class it compiles
into your project is called 'MyProject' under the 'My' namespace. For
example, the full name is "WinApplication1.My.MyProject". It's a special
class that we call a Module in VB syntax. In addition, another invisible
class is created. It's called 'MyForms'. It is as a nested class inside
class MyProject. It has one property per Form in the project. Each
property's name is the same name as the Form's class name. Each property
returns an instance of a Form of the corresponding Form type. The module
MyProject has a property called Forms. It is of type MyForms.

Whenever you write:

FormClassName.Member

the VB compiler behaves very special: 'FormClassName' is resolved to
Forms.FormClassName. As 'MyProject' is a Module, the Forms property is
actually a shared member. Consequently, there can be exactly one default
instance of each Form in your project.


So far, so bad. Back to your project. If you write
'Explorer1.AddFolder2Database', you are accessing the default instance of
the Form. Hovering the mouse above 'Explorer1', the IDE is incorrectly
showing "Class Explorer1". Well, it's also a class, but not in this context.
If it was resolved to the class name, you would only be able to access the
shared members. In fact you are able to write

Explorer1.Show

How can this be possible as Explorer1 is a class but Show is an _instance_
member? Actually Explorer1 is a property, but MSFT doesn't want us to know
this and prefers to hide the details.

(Hopefully) coming to the solution: How did you create an instance of Form
Explorer1 that you see on the screen? If you add folders (in
AddFolder2Database) and they don't appear on your visible Form, I guess you
didn't show the default instance but are you adding the items to the default
instance.

BTW, why do you call TreeView.Refresh? (I do have a reason for this question
but will wait for your answer.)


If you don't want to be confused by this intransparent and badly designed
model (namely the whole My.Crap), just add

_mytype="empty"

to the compile constants in your project's properties. I've created a
project template for this. But, don't be surprised if you will have
additional 1001 questions after that. ;-) (No, it would not solve your
problem! - but mine)

See also:
http://msdn.microsoft.com/en-us/library/ms233781.aspx
(anyway, it does not really make things more comprehensive)


Armin
 
Co,

Did you see that it was something that did not work and the question was how
to make it to work.

The reply was simple, don't use it, it .................., could have been
my reply.

Never use a second form to do Data Access, simply make a Data Class in your
project or in a separate data layer (you can better do the first), then you
can use that in all your forms,

Cor
 
Co,

Did you see that it was something that did not work and the question was how
to make it to work.

The reply was simple, don't use it, it .................., could have been
my reply.

Never use a second form to do Data Access, simply make a Data Class in your
project or in a separate data layer (you can better do the first), then you
can use that in all your forms,

Cor
 
You really must be more precize if you expect help from others. Above you
wrote "it doesn't recognize it". Now you write "it doesn't show". I'm gonna
assume the latter. Or, "it doesn't show" via intellisense? I don't know.

Seems to be one of the problems MSFT reintroduced with the reintroductionof
the fatal Form "default instances" they got rid of in VB 2002/2003. Was
meant to make it easier for beginners. Yeah, sure - but it doesn't. I can't
tell you how much I "dislike" these default instances.

I hardly know where to start..., well, the first thing you have to know is
that VB does several things under the hood. This makes it sometimes
complicated to understand how things work. One invisible class it compiles
into your project is called 'MyProject' under the 'My' namespace. For
example, the full name is "WinApplication1.My.MyProject". It's a special
class that we call a Module in VB syntax. In addition, another invisible
class is created. It's called 'MyForms'. It is as a nested class inside
class MyProject. It has one property per Form in the project. Each
property's name is the same name as the Form's class name. Each property
returns an instance of a Form of the corresponding Form type. The module
MyProject has a property called Forms. It is of type MyForms.

Whenever you write:

    FormClassName.Member

the VB compiler behaves very special: 'FormClassName' is resolved to
Forms.FormClassName. As 'MyProject' is a Module, the Forms property is
actually a shared member. Consequently, there can be exactly one default
instance of each Form in your project.

So far, so bad. Back to your project. If you write
'Explorer1.AddFolder2Database', you are accessing the default instance of
the Form. Hovering the mouse above 'Explorer1', the IDE is incorrectly
showing "Class Explorer1". Well, it's also a class, but not in this context.
If it was resolved to the class name, you would only be able to access the
shared members. In fact you are able to write

    Explorer1.Show

How can this be possible as Explorer1 is a class but Show is an _instance_
member? Actually Explorer1 is a property, but MSFT doesn't want us to know
this and prefers to hide the details.

(Hopefully) coming to the solution: How did you create an instance of Form
Explorer1 that you see on the screen? If you add folders (in
AddFolder2Database) and they don't appear on your visible Form, I guess you
didn't show the default instance but are you adding the items to the default
instance.

BTW, why do you call TreeView.Refresh? (I do have a reason for this question
but will wait for your answer.)

If you don't want to be confused by this intransparent and badly designed
model (namely the whole My.Crap), just add

    _mytype="empty"

to the compile constants in your project's properties. I've created a
project template for this. But, don't be surprised if you will have
additional 1001 questions after that. ;-)   (No, it would not solve your
problem! - but mine)

See also:http://msdn.microsoft.com/en-us/library/ms233781.aspx
(anyway, it does not really make things more comprehensive)

Armin

Armin,

I must admit that I find it a very complicated story.
Which BTW has all to do with me and not with you.
I think I will have to skip this part because my knowledge is not
enough.

On your Q of why I refresh the Treeview is because a node was added.
I thought you always had to do a refresh afterwards.

Marco
 
You really must be more precize if you expect help from others. Above you
wrote "it doesn't recognize it". Now you write "it doesn't show". I'm gonna
assume the latter. Or, "it doesn't show" via intellisense? I don't know.

Seems to be one of the problems MSFT reintroduced with the reintroductionof
the fatal Form "default instances" they got rid of in VB 2002/2003. Was
meant to make it easier for beginners. Yeah, sure - but it doesn't. I can't
tell you how much I "dislike" these default instances.

I hardly know where to start..., well, the first thing you have to know is
that VB does several things under the hood. This makes it sometimes
complicated to understand how things work. One invisible class it compiles
into your project is called 'MyProject' under the 'My' namespace. For
example, the full name is "WinApplication1.My.MyProject". It's a special
class that we call a Module in VB syntax. In addition, another invisible
class is created. It's called 'MyForms'. It is as a nested class inside
class MyProject. It has one property per Form in the project. Each
property's name is the same name as the Form's class name. Each property
returns an instance of a Form of the corresponding Form type. The module
MyProject has a property called Forms. It is of type MyForms.

Whenever you write:

    FormClassName.Member

the VB compiler behaves very special: 'FormClassName' is resolved to
Forms.FormClassName. As 'MyProject' is a Module, the Forms property is
actually a shared member. Consequently, there can be exactly one default
instance of each Form in your project.

So far, so bad. Back to your project. If you write
'Explorer1.AddFolder2Database', you are accessing the default instance of
the Form. Hovering the mouse above 'Explorer1', the IDE is incorrectly
showing "Class Explorer1". Well, it's also a class, but not in this context.
If it was resolved to the class name, you would only be able to access the
shared members. In fact you are able to write

    Explorer1.Show

How can this be possible as Explorer1 is a class but Show is an _instance_
member? Actually Explorer1 is a property, but MSFT doesn't want us to know
this and prefers to hide the details.

(Hopefully) coming to the solution: How did you create an instance of Form
Explorer1 that you see on the screen? If you add folders (in
AddFolder2Database) and they don't appear on your visible Form, I guess you
didn't show the default instance but are you adding the items to the default
instance.

BTW, why do you call TreeView.Refresh? (I do have a reason for this question
but will wait for your answer.)

If you don't want to be confused by this intransparent and badly designed
model (namely the whole My.Crap), just add

    _mytype="empty"

to the compile constants in your project's properties. I've created a
project template for this. But, don't be surprised if you will have
additional 1001 questions after that. ;-)   (No, it would not solve your
problem! - but mine)

See also:http://msdn.microsoft.com/en-us/library/ms233781.aspx
(anyway, it does not really make things more comprehensive)

Armin

Armin,

I must admit that I find it a very complicated story.
Which BTW has all to do with me and not with you.
I think I will have to skip this part because my knowledge is not
enough.

On your Q of why I refresh the Treeview is because a node was added.
I thought you always had to do a refresh afterwards.

Marco
 
Co said:
I must admit that I find it a very complicated story.
Which BTW has all to do with me and not with you.
I think I will have to skip this part because my knowledge is not
enough.

This time long story short: How did you show Explorer1? Is it the startup
form? Did you write Explorer1.Show? Or did you write

dim f as new explorer1
f.show

anywhere?
On your Q of why I refresh the Treeview is because a node was added.
I thought you always had to do a refresh afterwards.

The Treeview updates itself if you change something. Doesn't it work without
Refresh?


Armin
 
Co said:
I must admit that I find it a very complicated story.
Which BTW has all to do with me and not with you.
I think I will have to skip this part because my knowledge is not
enough.

This time long story short: How did you show Explorer1? Is it the startup
form? Did you write Explorer1.Show? Or did you write

dim f as new explorer1
f.show

anywhere?
On your Q of why I refresh the Treeview is because a node was added.
I thought you always had to do a refresh afterwards.

The Treeview updates itself if you change something. Doesn't it work without
Refresh?


Armin
 
Armin said:
This time long story short: How did you show Explorer1? Is it the startup
form? Did you write Explorer1.Show? Or did you write

dim f as new explorer1
f.show

anywhere?


The Treeview updates itself if you change something. Doesn't it work
without Refresh?

I'm just winging it now, but it cross my mind when you said this that
this is one of the GUI OOPS optimization concept that Anders did in
Delphi GUI OOPs brought to .NET GUI OOPs - events are not triggered if
the "value" has not changed.

In other words, repeating this

TextBox1.Text = "foobar"
TextBox1.Text = "foobar"
TextBox1.Text = "foobar"
TextBox1.Text = "foobar"
TextBox1.Text = "foobar"

should only trigger one event because the value did not change. This
idea is a major advancement in Message Queue optimization to minimize
automatic event propagation in GUI oops design.

For example, with three controls in a form:

TextBox1 with text = ""
ListBox1 to show change events
Button1 to start test

Public nChanged As Integer = 0
Private Sub TextBox1_TextChanged( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles TextBox2.TextChanged
nChanged += 1
ListBox1.Items.Add("Changed: " + Str(nChanged))
End Sub

Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar"
End Sub

When you vlick Button1, you will see only 1 event logged.

Change it to:

TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar1"
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar2"

and you should see 4 change events logged.

Again, I am just winging it, maybe that is what he is seeing?

-
 
Armin said:
This time long story short: How did you show Explorer1? Is it the startup
form? Did you write Explorer1.Show? Or did you write

dim f as new explorer1
f.show

anywhere?


The Treeview updates itself if you change something. Doesn't it work
without Refresh?

I'm just winging it now, but it cross my mind when you said this that
this is one of the GUI OOPS optimization concept that Anders did in
Delphi GUI OOPs brought to .NET GUI OOPs - events are not triggered if
the "value" has not changed.

In other words, repeating this

TextBox1.Text = "foobar"
TextBox1.Text = "foobar"
TextBox1.Text = "foobar"
TextBox1.Text = "foobar"
TextBox1.Text = "foobar"

should only trigger one event because the value did not change. This
idea is a major advancement in Message Queue optimization to minimize
automatic event propagation in GUI oops design.

For example, with three controls in a form:

TextBox1 with text = ""
ListBox1 to show change events
Button1 to start test

Public nChanged As Integer = 0
Private Sub TextBox1_TextChanged( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles TextBox2.TextChanged
nChanged += 1
ListBox1.Items.Add("Changed: " + Str(nChanged))
End Sub

Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar"
End Sub

When you vlick Button1, you will see only 1 event logged.

Change it to:

TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar1"
TextBox1.Text = "Foobar"
TextBox1.Text = "Foobar2"

and you should see 4 change events logged.

Again, I am just winging it, maybe that is what he is seeing?

-
 
This time long story short: How did you show Explorer1? Is it the startup
form? Did you write Explorer1.Show? Or did you write

    dim f as new explorer1
    f.show

anywhere?


The Treeview updates itself if you change something. Doesn't it work without
Refresh?

Armin

It doesn't work with refreshing and it doesn't work without.
The new node isn't shown.

Explorer1 is my main form but it is called from within my login form:

Explorer1.Show()

then the login form is hidden.
from within Explorer1 load event:
frmLogin.Hide()

Marco
 
This time long story short: How did you show Explorer1? Is it the startup
form? Did you write Explorer1.Show? Or did you write

    dim f as new explorer1
    f.show

anywhere?


The Treeview updates itself if you change something. Doesn't it work without
Refresh?

Armin

It doesn't work with refreshing and it doesn't work without.
The new node isn't shown.

Explorer1 is my main form but it is called from within my login form:

Explorer1.Show()

then the login form is hidden.
from within Explorer1 load event:
frmLogin.Hide()

Marco
 
Co said:
It doesn't work with refreshing and it doesn't work without.
The new node isn't shown.


You're right, if it's added to an invisible Form, refreshing doesn't help.
:-)

Explorer1 is my main form but it is called from within my login form:

Explorer1.Show()

then the login form is hidden.
from within Explorer1 load event:
frmLogin.Hide()


In this case I've run out of ideas. From here it's hard to say. If you don't
create another instance of Explorer1, it should work.

Another attempt: What does the code to add the node look like? Are you
performing any long running actions directly after adding the node?


Armin
 
Co said:
It doesn't work with refreshing and it doesn't work without.
The new node isn't shown.


You're right, if it's added to an invisible Form, refreshing doesn't help.
:-)

Explorer1 is my main form but it is called from within my login form:

Explorer1.Show()

then the login form is hidden.
from within Explorer1 load event:
frmLogin.Hide()


In this case I've run out of ideas. From here it's hard to say. If you don't
create another instance of Explorer1, it should work.

Another attempt: What does the code to add the node look like? Are you
performing any long running actions directly after adding the node?


Armin
 
You're right, if it's added to an invisible Form, refreshing doesn't help..
:-)




In this case I've run out of ideas. From here it's hard to say. If you don't
create another instance of Explorer1, it should work.

Another attempt: What does the code to add the node look like? Are you
performing any long running actions directly after adding the node?

Armin

Armin,

this is what happens:
from frmZoeken I call the save to Treeview option in the menu:
Case "Opslaan"
SaveQueryInTreeview()

Private Sub SaveQueryInTreeview()

Dim sNewFolder As String = "Nieuwe Map"
Dim node = Explorer1.TreeView.TopNode
Dim nodeID = node.row("ID")
node.Nodes.Add(sNewFolder)
Explorer1.AddFolder2Database(nodeID, sNewFolder)
'Explorer1.TreeView.Refresh()

End Sub

From the main form Explorer1 the node is added.
Then the folder number is added to the database:

Public Sub AddFolder2Database(ByVal iParent As Integer, ByVal
sFolderName As String)

'this code will add a new folder to the database
conn.Open()
Dim sql As String = "SELECT * FROM Kabinet"
Dim strTable As String = "Kabinet"
Dim da As New OleDb.OleDbDataAdapter(sql, conn)
Dim cb As New OleDb.OleDbCommandBuilder(da)
Dim ds As New DataSet
Dim newRow As DataRow

cb.QuotePrefix = "["
cb.QuoteSuffix = "]"

Try
da.FillSchema(ds, SchemaType.Source, strTable)
newRow = ds.Tables(strTable).NewRow()
newRow("foldername") = sFolderName
newRow("parent-id") = iParent

'add the new row to the dataSet
ds.Tables(strTable).Rows.Add(newRow)

'sent the updated dataSet to the database
da.Update(ds, strTable)

Catch oException As OleDbException
MessageBox.Show(oException.Message)

Catch oException As Exception
MessageBox.Show(oException.Message)

End Try
conn.Close()
'now let's update the treeview with the new node.
TreeView.Nodes.Clear()
Call LoadTree()

End Sub

So everything here is done except that the newly added node isn't
shown.

Marco
 
Back
Top