内部TextBox的自定义控件属性

时间:2012-11-14 16:52:09

标签: c# winforms visual-studio-2012 custom-controls designer

考虑具有属性Rows的自定义控件:

private EMRow[] _rows;

public CustControl()
{
    InitializeComponent();
}

public EMRow[] Rows
{
    get
    {
        return _rows;
    }
    set
    {
        _rows = value;
    }
}

每个EMRow创建一个TextBox并公开两个属性,一个用于Text,另一个用于控件本身:

private TextBox _txtValue;

public EMRow()
{
    if (_txtValue == null)
        _txtValue = new TextBox();
}

public string Value
{
    get
    {
        return _txtValue.Text;
    }
    set
    {
        _txtValue.Text = value;
    }
}

public TextBox ValueTextBox
{
    get
    {
        return _txtValue;
    }
    set
    {
        _txtValue = value;
    }
}

如果将此自定义控件拖放到表单上并修改Value属性,它会更新并保护对designer.cs文件的更改。

当您深入查看ValueTextBox属性(再次,Visual Studio设计器中的所有属性,而不是代码)并修改属性时,更改不会保存到designer.cs文件中。就设计者而言,甚至没有创建和引用此属性的TextBox对象。

我确信这是'按预期'的行为,但我很难理解为什么。我在这里错过了VS设计师的基础吗?

1 个答案:

答案 0 :(得分:1)

经过一番挖掘后,我找到了解决这个问题的方法,告诉设计者通过添加DesignerSerializationVisibility属性来序列化这个对象

private TextBox _txtValue;

public EMRow()
{
    if (_txtValue == null)
        _txtValue = new TextBox();
}

public string Value
{
    get
    {
        return _txtValue.Text;
    }
    set
    {
        _txtValue.Text = value;
    }
}

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public TextBox ValueTextBox
{
    get
    {
        return _txtValue;
    }
    set
    {
        _txtValue = value;
    }
}    

Winforms Designer: Modify (and keep) properties in sub objects 谢谢汉斯!