2013-03-03 171 views
0

我是Winforms和C#的新手,所以这可能听起来像一个愚蠢的问题。我有如下所示的类,用于创建要作为模态对话框显示的窗体。窗体不显示任何东西

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

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

    } 

} 

然而对于一些振振有辞当我使用ShowDialog方法来显示这种形式它不显示任何东西。我应该怎么做才能将这个列表框添加到这个表单中?

编辑:

我用代码显示形式:

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

您正试图显示列表框而不是表单。 – ChrisF 2013-03-03 20:34:45

+0

请参阅我的编辑@ChrisF我认为它对你所说的内容有所了解 – Cemre 2013-03-03 20:38:10

+0

在你的FrmDelivery构造函数中仍然有's.Show();'。这是错误的。您也不会将列表框添加到可视化树中。如果你解释了为什么你不能使用XAML这可能会有所帮助。 – ChrisF 2013-03-03 20:39:30

回答

1

我建议你使用Add | New Item | Windows Form创建一个新窗体。 然后,您将获得一个设计界面,您可以添加一个列表框以及生成的代码,以正确地初始化您的窗体和列表框。特别是你的表单和列表框会获得当前没有的默认大小。然后

你的代码(比如Form1.cs中)将与此类似:

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; 
     } 
    } 
} 

另外会有一个代码负载Form1.Designer。CS类似

.... 

    #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 

而且你可以用你的表格是这样的:

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); 
      } 
     } 
    } 
+0

如果你不介意我问:我如何做到这一点,以便当用户从列表框中选择一个值时,我可以从调用'ShowDialog'方法的位置获取值? – Cemre 2013-03-03 21:43:19

+1

你应该问另一个问题 - 但我已经更新了我的答案。 – Phil 2013-03-03 21:51:03

2

一注 - WPF使用Windows,而不是形式,所以我不明白为什么你从窗体而不是Window派生。但我会回答,就像你在谈论一个WPF窗口作为你的“表单”一样。

首先,需要显示窗口。目前,提供的代码不显示窗口,它试图显示一个ListBox

其次,您需要添加一个LayoutPanel到窗口并添加您的ListBox作为布局面板的子项。布局面板有许多不同的风格,例如GridsStackPanelsCanvases,这取决于您想要的布局类型。

或者,您可以将WindowContent设置为您的ListBox。这意味着Window上只有您的ListBox', so if you want multiple visual elements on your窗口,您需要使用布局面板。

第二种方法看起来像

this.Content = s; 

对于第一种方法,我建议你在WPF布局面板读了。 Here is one tutorialhere是布局上的MSDN主题。谷歌搜索将产生更多的结果。

+0

对不起,我的意思是WinForms我的坏..我不认为它有一个内容属性 – Cemre 2013-03-03 20:43:44

+0

+1的答案 - 即使它不再适用,它回答了原来的好。 – NDJ 2013-03-03 20:54:24

+0

问题是关于WinForms而不是WPF – Phil 2013-03-03 20:58:39

1

您需要将列表框添加到控件集合:

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

    this.Controls.Add(s); 
} 

这将得到控制到您的形式你,虽然有一堆,你可能会希望设置其他属性(如以像其他人所说的那样),您可以看到设计人员如何在代码中执行此操作,方法是将列表框放到表单上并检查生成的代码。

1

你不应该只控件添加到集合中还设置了他的caracteristics。至少。 大小&进驻。

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. 

} 

}

希望这将有助于

0

请看看你是否在注释掉默认构造有在InitializeComponent()。它通常初始化FormLoad上窗体的所有控件。