Cemre Mengü
Cemre Mengü

Reputation: 18754

Form doesn't show anything

I am new to Winforms and C# so this may sound like a stupid question. I have the class shown below for creating a form to be displayed as a modal dialog.

class FrmDelivery : Form
{
    ListBox s;
    public FrmDelivery()
    {
        s = new ListBox();

        s.DataSource = new List<int>(){1,2,3,4};
        s.Update();
        s.Show();

    }

} 

However for some reson when I use the ShowDialogmethod to display this form it doesnt show anything in it. What should I do to add a list box to this form ?

EDIT:

I use the code to display the form:

       FrmDelivery frm = new FrmDelivery();
        frm.ShowDialog();

Upvotes: 0

Views: 4048

Answers (5)

Neo
Neo

Reputation: 111

Please see if you have the InitializeComponent() in the default construct commented out. It usually initializes all the control of the form on FormLoad.

Upvotes: 0

Phil
Phil

Reputation: 42991

I suggest you create a new form using Add|New Item|Windows Form. You will then get a design surface to which you can add a listbox, and generated code which will initialize your form and listbox correctly. In particular your form and listbox will gain default sizes which they don't have currently.

Your code (in say Form1.cs) will then be similar to this:

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

        this.listBox1.DataSource = new List<int> { 1, 2, 3, 4 };
    }

    public int? SelectedValue
    {
        get
        {
            return (int?)this.listBox1.SelectedValue;
        }
    }
}

Plus there will be a load of code in Form1.Designer.cs similar to

....

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.listBox1 = new System.Windows.Forms.ListBox();
        this.SuspendLayout();
        // 
        // listBox1
        // 
        this.listBox1.FormattingEnabled = true;
        this.listBox1.Location = new System.Drawing.Point(30, 37);
        this.listBox1.Name = "listBox1";
        this.listBox1.Size = new System.Drawing.Size(120, 95);
        this.listBox1.TabIndex = 0;
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(284, 261);
        this.Controls.Add(this.listBox1);
        this.Name = "Form1";
        this.Text = "Form1";
        this.ResumeLayout(false);

    }

    #endregion

And you could use your form like this:

    private void button1_Click(object sender, System.EventArgs e)
    {
        using (var form = new Form1()) // you should dispose forms used as dialogs
        {
            if (DialogResult.OK == form.ShowDialog()) // optional (you could have OK/Cancel buttons etc
            {
                Debug.WriteLine(form.SelectedValue ?? -1);
            }
        }
    }

Upvotes: 1

NDJ
NDJ

Reputation: 5194

You need to add the listbox to the controls collection:

ListBox s;
public FrmDelivery()
{
  s = new ListBox();
  s.DataSource = new List<int>() { 1, 2, 3, 4 };

  this.Controls.Add(s);
}

This will get the control onto your form for you, though there are a bunch of other properties you will likely want to set (e.g. to get it looking how you want) - as others have mentioned, you can see how the designer does this in the code behind by putting a listbox onto a form and examining the resulting code.

Upvotes: 1

Gauthier G. Letellier
Gauthier G. Letellier

Reputation: 3385

You should not only add the controls to the collection but also set up his caracteristics. Size & emplacement, at least.

class FrmDelivery : Form
{
ListBox s;
public FrmDelivery()
{
    s = new ListBox();
    s.Location = new System.Drawing.Point(0, 0); //relative to the parent control (not an absolute value, so)
    s.Name = "listBox1";
    s.Size = new System.Drawing.Size(120, 95);


    s.DataSource = new List<int>(){1,2,3,4};
    this.Controls.Add(s); //it will add it to the form but you can add it to another control, like panel.

}

}

Hope it will help

Upvotes: 1

Brian S
Brian S

Reputation: 5785

One note - WPF uses Windows, not Forms, so I'm not clear why you're deriving from Form rather than Window. But I'll answer as if you were talking about a WPF Window as your "form".

First, something will need to display the Window. Currently, the code provided doesn't show the Window, it attempts to show a ListBox.

Second, you either need to add a LayoutPanel to the window and add your ListBox as a child of the layout panel. Layout Panels come in many flavors, such as Grids and StackPanels and Canvases based on what type of layout you want.

Or, you can set the Content of the Window to be your ListBox. This will mean the only thing on the Window is your ListBox', so if you want multiple visual elements on yourWindow`, you'll need to use a layout panel.

The second approach would look like

this.Content = s;

For the first approach, I'd recommend reading up on Layout Panels in WPF. Here is one tutorial and here is the MSDN topic on layout. A google search will yield many more results.

Upvotes: 2

Related Questions