Feedback request: Form constructors?

A quick request for feedback… How often do you:

  • Use Sub New in a form instead of handling the form’s Load event?
  • When you do use Sub New, are there things that you have to do before the call to InitializeComponent, or do things generally go after the call to InitializeComponent?

We’re thinking about how to solve some issues that we’ve uncovered in the beta and this feedback might help in deciding how to deal with them. Thanks!

21 thoughts on “Feedback request: Form constructors?

  1. Paul Wilson

    I use new many times, often with parameters as well. And at least some times things are dynamic enough that my code must run before InitializeComponent. And for that matter, I often must modify the code that VS claims we are not supposed to modify.

    Reply
  2. Fan

    1. I usually use Form_Load in VB and the constructor in C#. I think Form_Load occurs earlier then the constructor of forms, am I right?

    2. I usually put the code after the call to InitializeComponent.

    Are you deciding to expose Sub New to the user partial of the Form class?

    Reply
  3. Matthew Wills

    I use Sub New only if I need to possibly cancel the creation of a form (since throwing an error in the constructor will ‘cancel’ object creation) – and in this case it is almost always before the call to InitializeComponent.

    Its a fairly rare requirement – maybe 10% of the time.

    Reply
  4. Lan

    I use New then create new instance of Form, and pass parameters then need to assign values to private variable of instance of Form.

    l do assignment BEFORE InitializeComponent.

    If l need to assign any attributes of controls of form by value of private variables l do it AFTER InitializeComponent

    I use load event enough seldom.

    Reply
  5. Arild

    Normally I’m using the Sub New method and place a call to my own Initialize method after Initialize Component. When I want to pass an object to the Form, I overloads Sub New with a parameter and call this instead.

    I never use Form_Load.

    Reply
  6. Michele Bernardi

    I usually use Form_Load event.

    Why?

    1) I don’t like to mix my code with the windows forms designer generated code.

    2) It’s more "clean" for everything that it’s "layout" in my mind…

    I use the constructor when:

    a) I have to do something before initialize component (really rare)

    b) I’m creating a form that will be base for other forms (using sub New I’m sure that this code will run even if someone overrides OnLoad)

    …BTW what about default instance in VB.NET 2005? It’s really the most ugly feature I can imagine now… πŸ™ Isn’t it better to control the creation/destruction of forms with your own code? Do you know if there will be?

    Reply
  7. Michele Bernardi

    I don’t know how, but a really cool stuff for next generation of Windows Forms in my opinion would be the possibility of doing an Application.run of second WF before closing the main one…

    Example: in a "multi form" wizard it would be nice to have a button in which I can write:

    Me.Close

    Application.run(new formX)

    P.S.=Sorry for my bad english… πŸ™

    Reply
  8. Pingback: .NET Forever

  9. Travis

    I almost always use the form constructor and place init code after the InitializeComponent call.

    I’ve used the Load event handler one time.

    Reply
  10. Cory Smith

    I still use the Form_Load event for most of the initialization of the form. The only time that I can think that I actually use the New() constructor on forms is when I want to change the signiture of the constructor to take a parameter of some type. Usually this is passing in some object that is created on the main form and the child form needs to interact with that object.

    The main reasons I use the Form_Load is a) it VB’ish and just feels right, b) when I double click on a form… that’s where the designer puts me πŸ˜‰

    I can’t remember doing anything before the InitializeComponent…

    I would like to see the constructor pulled out of the don’t touch block; however, I can understand the reasoning for it being there. For those that need to modify it, it’s probably fine where it is.

    Now that I’ve answered your questions… I’ve got one. You’ve got me curious as to "issues that we’ve uncovered in the beta" are and your rational for these questions in regards to those "issues", after this feedback can you elaborate πŸ˜‰

    Reply
  11. Pingback: Panopticon Central

  12. Nicole Calinoiu

    I use the constructor often, mostly when inheriting from a subclass of Form. In such cases, the base class would define a constructor with some important argument that must be set at instantiation (or at least at run-time instantiation since the designer requires use of a default constructor), and the end form’s default constructor is usually mapped to the non-default base class constructor.

    At least at run-time, the constructor actions definitely need to run before InitializeComponent since the base class will not be in a reliable and/or useable state until its non-default constructor has run.

    Reply
  13. Cade Perkins

    I place most code in the constructor. If I happen to double-click the form and the Load handler is created, then I may use that. I rarely take the time to manually override OnLoad. I’ve only had to place code before InitializeComponent once, but only because a custom control on the form wasn’t designed very well.

    From VS.NET documentation, it seems that it doesn’t really matter whether the New or Load event. So, a more detailed description of what happens between construction and each event would help.

    Reply
  14. Enders

    I use the New method to overload thing

    public sub new()

    public sub new(mydetail as data)

    dim fDetails as new frmDetails(ClientX)

    fdetails.show

    I could also overload show. Still figuring out what is the best

    Reply
  15. Shawn

    I do believe you can label a class as main in your

    project properties and call all forms from there.

    I believe the method handling MyBase.load

    must take the system object param. not sure,

    example

    Public Class MyMain

    Private Sub main()handles MyBase.load

    Dim formOne as Form

    formOne = new existingForm

    ‘ key in before clock runs out

    formOne.Show

    Dim clock ‘ intitialize timer

    Dim myTime As Integer = 15

    While Cint(time.getSec) < myTime

    formOne.blinkCount()

    End While

    ‘ variables initialized in New Constructor

    ‘ and all methods accessable after close

    ‘ call overriden close method

    ‘ where close method assignes the

    ‘ data from components to variables

    ‘ as the destroy/close method called

    ‘ on close also destroys all components.

    ‘ override new in your existing form

    ‘ initialize what you wish to share.

    ‘ needs testing but I believe

    ‘ you can instantiate multiple

    ‘ instances of same form VB.net

    ‘ if not, existingForm.enabled

    ‘ allows you to use methods of

    ‘ form class and the methods

    ‘ in your form..

    ‘ like exsistingForm.ShowDialog()

    ‘ or exsistingForm.MyCount()

    formOne.close()

    formOne.GetResult()

    End Sub

    So now go use your form and feed it different params

    Write a way to define your components with xml

    and browse you program like a web page.

    I do believe if you have a form.designer.vb source with

    the form.vb they combine to create one class thus the key word partial… You can eliminate this, but why

    Just Getting this now. I know it needs work

    Reply
  16. Shawn

    When looking to assign a class as main form I am only given the option of forms that i have in the project…

    One could create a form and close it overriding the destroy method to just close the window as soon as it opens… I don’t think this is the best way…

    I am in the process of finding out if one could manually set a class as the main load…

    This should work. It just has a couple of kinks /

    Reply

Leave a Reply