|
Better yet, why is code in Form2 referencing anything at all in Form1?
It should be the job of Form1 to set focus on one of it's controls, not Form2.
Or am I missing something?
|
|
|
|
|
That would be a better solution.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Hello !
I'm using VB.net 2013 and entity Framework 6.
I have a form with a bindingsource.
On the form's load event i have this instruction :
Myobjectbindingsource.datasource=(From t in context.Myobjects Select t).Tolist
I have another event :
Private Sub MyObjectbindingsource_CurrentChanged(sender As Object, e As EventArgs) Handles MyObjectbindingsource.CurrentChanged
Messagebox.show("Hello")
End Sub
If context.myobjects is not empty , before the form is shown , the message "Hello" is displayed 3 times.
My question is why the currentChanged event is called 3 times , because there's only 1 instruction that change items on bindingsource ?
Thank you !
|
|
|
|
|
The CurrentChanged event is raised whenever the Current property changes for any of the following reasons:
- The current position of the List changes.
- The DataSource or DataMember properties change.
- The membership of the underlying List changes, which causes Position to refer to a different item. Examples include adding or deleting an item before the current item, deleting or moving the current item itself, or moving an item to the current position.
- The underlying list is refreshed by a new sorting or filtering operation.
First thing that happens is #2, and I'd expect #1 after that (move to first position in the set), add #4 and you have three calls.
Which is mostly guessing, since I cannot see all code.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Thank you , but actually I want to display the message only once , when the current position change. What condition should I use to distinguish from 2 other cases ?
Thank you !
|
|
|
|
|
Keep a reference to the last known "current" value. If the event occurs, then "current" will already point to something new. If it doesn't, than nothing has changed and you can ignore it.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Hello !
I have a vb.net 2013 application.
On application Properties , I have configured as startup form a form that act as a login form.
(After this login form is closed , the main form is displayed.)
On Shutdown mode I have " When last form closes"
But now , when I click the x button to close my main form , the form is closed but the application is not fully closed and is still running.
I've tested and I've found that when the form is closing Application.OpenForms.Count is 1. So as I've configured this is the last form and closing this should close the application but this is not happening.
What can I do ?
|
|
|
|
|
Have you started any other threads in your application? An application will not close if there are any threads still running.
Cheers,
Mick
------------------------------------------------
It doesn't matter how often or hard you fall on your arse, eventually you'll roll over and land on your feet.
|
|
|
|
|
Ok , let me explain :
As I've said , the first form is the Loginform,After the login form is closed , the Mainform is open.
On LoginForm , I have 2 instruction that seems to have relation with threads ( I don't know for sure ) :
System.Math.Max(System.Threading.Interlocked.Increment(i), i - 1)
System.Math.Max(System.Threading.Interlocked.Decrement(n), n + 1)
After the loginform is closed nothing happens. But when I try to close the MainForm , as I've said the application does not terminate.
What can I do ?
Thank you !
|
|
|
|
|
No, those statements do not start threads, but are designed for other threads to safely access "i". This is a tricky sort of bug to find. You will have to get into the debugger, allow the forms to close, and then pause the application and open the "threads" view window. Take a look at the threads that are still running - there'll have to be at least one of them. Examine each thread, and see if they are executing any of your code. You may also have to check the call stack for each thread, if they are executing native code, and see if any of you call got it to that point. Once you find out if any of your .net code is to blame or not, you can then figure out how it got into its state.
Cheers,
Mick
------------------------------------------------
It doesn't matter how often or hard you fall on your arse, eventually you'll roll over and land on your feet.
|
|
|
|
|
On all my forms I have several queries from entity framework.
when I close my main form , as I've said my application does not ends. I have paused as you've said , and on Threads list I have all these queries that are in my main form.
I did another test.
I have open several other forms.And after I have closed all these forms. And when I close the mainform , the application did not finish so I've paused again and on the thread list I see a list with all these queries from all the forms that I've open.
But it's strange because these queries are executed by demand , I mean when I click on buttons on these forms.
What can I do ?
Thank you !
|
|
|
|
|
I do not know the structure of EF, but from what you say, each of these queries are operating on separate threads, and just hold in a wait state ready to be used. There must be some mechanism to close or dispose of these objects, which is what you need to be doing before the form is closed.
Cheers,
Mick
------------------------------------------------
It doesn't matter how often or hard you fall on your arse, eventually you'll roll over and land on your feet.
|
|
|
|
|
Sorry , but is possible that something to operate on separate thread if I don't have this kind of separation on my code ?
For example one of this query is ;
MyobjBindingSource.DataSource = (From t In context.myobjs Where t.art = art1
Select t).ToList
And this query is executed on main's Load event.
Why this query is still active even when this Load event is already finished ?
|
|
|
|
|
I would say that the offending object is context. How is that declared? Is it static? Or Is it local? Is it disposable? You need to make sure that the context object is closed or disposed after you have finished using it, and most definitely before the form is closed.
Cheers,
Mick
------------------------------------------------
It doesn't matter how often or hard you fall on your arse, eventually you'll roll over and land on your feet.
|
|
|
|
|
the context Is local.
is declared on Main form :
dim context as new myEntities and also I've tried to call context.dispose on Main form's closing event , but the problem remain the same.
modified 1-Nov-16 1:13am.
|
|
|
|
|
Then I'm not sure what is holding on to the threads. Without having a debugger in front of me, it's impossible to tell. You just need to make sure that everything that is disposable has been properly cleaned up. Sorry, can't be of any more help sitting in my room here in Australia. Perhaps someone with a little more EF background may have an idea of what it could be.
Cheers,
Mick
------------------------------------------------
It doesn't matter how often or hard you fall on your arse, eventually you'll roll over and land on your feet.
|
|
|
|
|
Are you actually closing the login form, or just hiding it?
You need to debug your code and check which forms are still open when you've closed your main form. For a Windows Forms application, look at the Application.OpenForms collection.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Yes I wrote before that I have checked the application.openforms.count and is 1.
Of course I have closed the login form. Only the main form is open and when I close this the application continue to run. On thread list I have those queries that I have explained above.
|
|
|
|
|
So if Application.OpenForms.Count is 1, even after you've closed the main form, then you need to drill into that collection to see which form is still open.
Then you need to work out why the hidden open form isn't being closed properly.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
The Application.OpenForms.Count is 1 before closing the main form.
|
|
|
|
|
Create a loop that prints all the form names in that collection, just to be sure that is correct.
The application would not terminate if a form is still open (might be invisible), or a foreground-thread is still running. In all other cases, the process ends.
If you say there are no other threads, then a form must be open. The other works also; if you say there's no form open and can validate that, there must be a thread with a higher priority than a background-worker.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
In the Main form's FormClosing event I've put a line that show the application.openforms.count.And also I've put that line on Formclosed event.
In the FormClosing event that number is 1.
On FormClosed event that number is 0.
The application continue to run.
But nobody says a word for the Queries that remain on Thread list.
Are this queries that prevent the application to exit or no ?
|
|
|
|
|
desanti wrote: Are this queries that prevent the application to exit or no ? I can't say, depends on the priority of those threads. Any backgroundthread would terminate if the process ends. A foreground thread would prevent that.
You could check if they interfere by placing those queries in comments, and see if the problem persists.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
I've tried to run my application from running directly the exe file on /bin/debug folder. ( i'm running windows 10 ).
When the application is open , on task manager there's only 1 entry for my application under Apps section .
When I close my application , this icon on Apps section is removed , but an icon is added under Background processes , and this is never removed.
But on my application I have not start any other thread through my code.
What this can be ?
Thank you !
|
|
|
|
|
desanti wrote: What this can be ? If you did not start a thread, then the mainthread is not terminating.
The default entrypoint would be the "Main" method in the Program class. I'm not sure whether this is called the same in VB, but it would have a entry-point. It says something like "Application.Run(MainForm)"; if you have code that is running after that point, then the process continues.
If you don't have this code, then create it. Add a module called "Program", add the Main method, create your form there. That way you can put a breakpoint there and figure out what is happening.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|