Visual Studio会在设计器文件中继续插入荒谬的默认属性值

时间:2010-06-08 12:49:41

标签: .net visual-studio

我有一个简单的usercontrol,具有以下属性:

public partial class RichTextEditorControl : UserControl
{

    public string EditorText
    {
        get { return richTextBox1.Rtf; }
        set { richTextBox1.Rtf = value; }
    }

    public string EditorPlainText
    {
        get { return richTextBox1.Text; }
        set { richTextBox1.Text = value; }
    }
}

现在每当我编辑包含此控件的表单时,VS都会使用以下代码行填充其设计器文件,然后抛出设计器错误:

this.richTextEditorControl1.EditorPlainText = 
   global::Project.Resources.MyResources_de_DE.SomeString;

现在我不知道它从哪里得到这个值?我搜索了整个解决方案,没有提到这个var,除了1个文件,需要它...

而且,VS写的代码,有错误吗?!它没有编译...... 我唯一能做的就是编辑设计器文件,但下次我必须用设计器编辑表单时,再次发生同样的错误...

 Error  25  The type or namespace name 'MyResources_de_DE' does not exist   
 in the namespace 'Project.Resources' (are you missing an assembly reference?)  

VS在哪里获得这个值?

3 个答案:

答案 0 :(得分:3)

您无法在设计器中有意义地编辑RTF。我只能猜测你曾经使用过一个自定义设计师,而且它有一些错误,以获得这样的值。或者你设法真的混淆了Windows窗体设计师。

Anyhoo,您根本无法将EditorText属性序列化。这与EditorPlainText属性严重冲突。它们都设置了富文本框的RTF。一个是格式化,另一个没有。您现在将获得随机故障,具体取决于最后设置的属性。强制设计者不要像这样序列化值:

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public string EditorText {
      // etc..
    }

您必须从表单中删除控件,并在此更改后将其添加回来。

答案 1 :(得分:1)

您是否在设计师中更改了表单或控件的语言属性?

这会导致项目创建资源文件。

答案 2 :(得分:1)

在这种情况下,您会认为设计人员会将您在usercontrol属性面板中设置的值(放置在使用者中时)与首次创建对象时该属性所具有的值进行比较,并且只生成一行如果值不同,则在usercontrol使用者的设计器文件中设置代码。不是这样。你需要在声明前面抛出这样的属性:

 <System.ComponentModel.DefaultValue("")> public string EditorPlainText ...

从设计器中删除错误行并尝试重建。这将解决问题。

有时你需要做其他花哨的东西才能让它适合,例如,如果你的属性是'控制'类型,你必须使用它来告诉设计师不要产生额外的(无用的)代码,如果属性通常为空:

 <System.ComponentModel.DefaultValue(GetType(Control), Nothing)> etc...

即使您不在乎,也应该这样做,以防您重构和删除不再使用或很少使用的方法(当然,只有当您控制所有使用的代码时才能这样做) - 从设计器文件中删除的行,表示“MyUserControl.UselessProperty = Nothing”之类的内容。

祝你好运。