Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 阻止设计器删除控件成员上的属性_C#_.net_Winforms_Visual Studio_Windows Forms Designer - Fatal编程技术网

C# 阻止设计器删除控件成员上的属性

C# 阻止设计器删除控件成员上的属性,c#,.net,winforms,visual-studio,windows-forms-designer,C#,.net,Winforms,Visual Studio,Windows Forms Designer,我想用属性标记Windows窗体上的某些控件。因此,我在我的TestAttributes.Designer.cs中添加了该属性: [AmbientValue(true)] private System.Windows.Forms.Label label1; 但是,每当我使用设计器的properties窗口更改label1的修饰符-属性时,设计器都会从声明中悄悄删除我的属性: public System.Windows.Forms.Label label1; 我尝试将声明放在TestAttri

我想用属性标记Windows窗体上的某些控件。因此,我在我的
TestAttributes.Designer.cs
中添加了该属性:

[AmbientValue(true)]
private System.Windows.Forms.Label label1;
但是,每当我使用设计器的properties窗口更改label1的
修饰符
-属性时,设计器都会从声明中悄悄删除我的属性:

public System.Windows.Forms.Label label1;
我尝试将声明放在
TestAttributes.cs
中,以免弄乱.Designer.cs文件。但是当更改
修饰符
属性时,声明会移回
TestAttributes.Designer.cs
,属性也会消失

如何防止设计器删除我的属性

编辑: 问题应该是:我是否可以将控件的声明永久移出
*.Designer.cs
文件,以便在那里应用属性?正如我在上面所写的,在某些情况下,它会被移回去

谢谢大家!!
richn

我通常不喜欢回答“不做”但不做的人

更改设计器类是危险的,并且几乎总是会导致意外的后果。设计器代码是为编译器保留的,它应该始终看起来像编译器期望的那样

如果您确实希望在设计器代码中包含属性,那么您应该创建一个空应用程序,自己编写表单代码。如果您不知道如何从头开始修改设计器代码,那么无论如何都不应该尝试修改设计器代码


如果这看起来需要做很多工作,您可以尝试将设计器用作模型,然后将其复制到一个新的非windows窗体项目。

直到最近,我才开始相信设计器只是代码的一部分,它是不可触摸的。我错了。事实证明,你可以把整个东西撕下来,然后编译器会向你抛出一个错误。好的,那很好,定义你自己的东西,这样就完全不需要设计师了。这里是如何。说你有标签

<div id="div1" runat="server">
但是请记住,您必须引用在前端使用的带有runat=“server”标记的所有内容。因此,假设您有一个只有runat=“server”标签的页面,在后面我们将其称为

namespace yournamespace.something
{
    public class yourpagetitle: System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Image imgLogo;
        protected System.Web.UI.WebControls.TextBox tbDate;
        protected System.Web.UI.WebControls.Label yourLabelName;

注意,我添加了图像和文本框作为附加示例。还有胡扎!因此,您完全不需要designer.cs文件。哦,请注意,designer.cs文件只不过是我们刚才所做的,但它会自动为您完成这项工作。。。大多数时候。。。当它失败时,是时候用你自己的方式来处理事情了。我相信,如果你重新格式化你的电脑,重新安装所有东西,等等,毫无疑问,一切都会恢复正常。对于那些没有时间照看和解决Microsoft所做的每一个小故障的人来说,这只是一个合理的解决办法。

如果您想保持设计器支持,我建议使用外部类库

    namespace ClassLibrary1
    {
        [System.ComponentModel.AmbientValue(true)]
        public class TestClass : System.Windows.Forms.Label
        {
        }
    }
您可以将类似的内容编译到类库中,然后将其导入VisualStudio。如果您不知道如何操作,请按照以下说明操作

  • 右键单击工具箱
  • 单击“选择项目”
  • 等等。现在不要犯终止visual studio的错误
  • 选择浏览
  • 选择您的dll文件

  • 这有很多问题。首先,您不应该修改
    *.Designer.cs
    文件,因为它是由设计器自动重新生成的。这就是为什么默认情况下它是隐藏的。其次,将
    标签
    控件的环境值设置为
    没有任何意义。标签控件如何为
    true
    ?如果有必要,从控件继承并添加您想要的任何默认属性,然后在设计器中使用该自定义控件。是的,我知道修改.designer.cs文件是不好的,但我认为可能有一种方法可以从中获得标签声明。但我想我试过的也一样糟糕;-)
    Label
    AmbientValue
    只是测试应用程序中的示例,在我的实际应用程序中,它是一个自定义属性。您始终可以将内容从
    *.Designer.cs
    文件移到您自己的代码文件中。然后,设计师不会修改它们。这与您希望将代码添加到默认的
    Dispose
    方法时所做的相同。如果您知道它不好/不起作用,那么也不清楚您为什么要这样做。我确实尝试过将声明从
    *.Designer.cs
    中移到我自己的代码文件中。但是,当我更改
    修改器
    属性时,它会移回
    *.Designer.cs
    ,并且我的属性会丢失。是的,如果您避免使用设计器,您可以避免使用
    *.Designer.cs
    文件。事实上,这就是文件的全部目的。它是一个由设计器自动生成的私有文件,为了方便起见,它使用分部类来实现,以向用户隐藏它。如果不使用设计器,则不必使用设计器文件。但是,如果您确实修改了设计器文件,那么每当您再次在设计器中工作时,它都会被重新写入。这里的系统没有任何问题。
        namespace ClassLibrary1
        {
            [System.ComponentModel.AmbientValue(true)]
            public class TestClass : System.Windows.Forms.Label
            {
            }
        }