我有一个简单的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在哪里获得这个值?
答案 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”之类的内容。
祝你好运。