2011-04-04 63 views
0

我有我认为我初始化一些成员的用户控件:为什么我的UserControl不能保持其初始化?

// MyUserControl.cs 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Data; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace MyNamespace 
{ 
    public partial class MyUserControl : UserControl 
    { 
     private string m_myString; 
     private int m_myInt; 

     public string MyString 
     { 
      get { return m_myString; } 
      set { m_myString = value; } 
     } 
     public int MyInt 
     { 
      get { return m_myInt; } 
      set { m_myInt = value; } 
     } 

     public MyUserControl() 
     { 
      InitializeComponent(); 

      MyString = ""; // was null, now I think it's "" 
      MyInt = 5;  // was 0, now I think it's 5 
     } 

     // ......... 
    } 
} 

当我插入这个控制到我的主要形式,虽然和调用内MyUserControl检查值的功能,事情并不像他们正在初始化:

// MainForm.cs 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace MyProgram 
{ 
    public partial class MainForm : Form 
    { 
     public MainForm() 
     { 
      InitializeComponent(); 
     } 

     private void MyButton_Click(object sender, EventArgs e) 
     { 
      // this prints 0 rather than 5 
      MessageBox.Show(this.theUserControl.MyInt.ToString()); 
     } 
    } 
} 

我猜这是一个真正简单错误,但我不知道在哪里。我已经尝试过预先添加this.,但这可能不是固定代码的方法。 :)

一如既往的感谢!

编辑: Pete建议您进入设计器代码,告诉我写入过程发生在哪里。首先我调用用户控件的构造函数,然后再用默认值覆盖这些值。我没有指定任何默认值(Sanjeevakumar Hiremath的建议),所以默认值是原始类型的默认值(对于int,这是0)。

+0

'私人字符串m_myInt控制这种行为;',物业类型为int。发布编码并重现问题的代码。 – 2011-04-04 22:01:11

+1

你的设计器代码是什么样的?你是否在你的UC构造函数代码中设置了一个断点,以查看什么时候碰到和什么时候出现? – 2011-04-04 22:02:08

+0

@Hans:对不起!我将变量名称更改为通用事物,并忘记改变它。 – John 2011-04-04 22:02:48

回答

3

你可能在这里看到的是设计师的神器。如果您在添加MyUserControl之后在设计器中打开了MainForm,则可能在生成的InitializeComponent方法MainForm中记录了默认值MyUserControl。这些记录的值在MyUserControl的构造函数运行后被重新赋值,因此它们将覆盖您设置的值。

您可以通过使用的DesignerSerializationVisibilityAttribute

+0

感谢您的回答。因此,DesignerSerializationVisibilityAttribute.Content具有仅为设计器中看到的内容生成代码的效果,而不是构造函数的组成部分。 – John 2011-04-04 23:42:42

2

使用[DefaultValue]属性。它允许您在设计器中未指定值时指定控件属性的默认值。

+0

谢谢你的回答。 – John 2011-04-04 23:38:01

相关问题