【问题标题】:Object does not match target type对象与目标类型不匹配
【发布时间】:2013-01-29 20:37:16
【问题描述】:

我有一个TableLayoutPanel,其中有一个PictureBox 控件网格。我正在尝试找到一种快捷方式将它们全部更改为标签控件,而不是手动删除每个控件并在每个单元格中放置新控件。

我以为我可以进入设计器代码并用 Label 查找/替换 PictureBox,但现在我得到了一个

“对象与目标类型不匹配”

Visual Studio 的错误列表中的错误。我现在也无法查看设计器页面。这是不允许的吗?如果允许,正确的做法是什么?

【问题讨论】:

  • 这就是你不直接编辑设计器文件的原因...
  • @Servy - 下次您向控件添加/调整大小/执行任何操作时,您的所有更改都将被删除。
  • meh,我数不清有多少次我快速更改了设计器代码中的某些内容。如果你知道你在做什么,那就没有问题。您可能错过了设计器代码中的某些内容。请仔细检查您的更改,我敢打赌这是您看过的小东西
  • 我试图找到一种快速的“查找和替换”方法,将表单上的所有控件从一种类型更改为另一种类型,而无需手动删除设计器上的每个控件并创建新的那些。
  • 在底部查看我的示例。标签未实现ISupportInitialize,这会导致您收到错误。因此,删除您尝试将标签投射到ISupportInitialize 的行,您的设计师会表现得很好:)

标签: c# .net winforms label picturebox


【解决方案1】:

如果您仔细查看生成的代码:

label1

this.label1 = new System.Windows.Forms.Label();
// 
// label1
// 
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(134, 163);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(35, 13);
this.label1.TabIndex = 1;
this.label1.Text = "label1";

pictureBox1

this.pictureBox1 = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
// 
// pictureBox1
// 
this.pictureBox1.Location = new System.Drawing.Point(97, 75);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(100, 50);
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;

我的猜测是

((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();

被你改成类似这样的东西:

((System.ComponentModel.ISupportInitialize)(this.label1)).BeginInit();

这不起作用,并导致设计器问题。 Object does not match target type.

所以,应用您已经做的更改,删除以下行:

((System.ComponentModel.ISupportInitialize)(this.label1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.label1)).EndInit();

我认为你很高兴。

【讨论】:

  • 标签不需要调用 BeginInit() 吗?如果是这种情况,你能解释一下吗?谢谢!
  • 不,请查看 BeginInit 上的文档“表示初始化正在启动的对象。”。对于未实现 ISupportInitialize 接口的控件,这是不可能的(当然也不需要)。
  • 错误消失了,我可以再次看到设计器表单,但它看起来不像我预期的那样。但错误确实消失了!
  • 啊,也许你还需要添加一个文本:)。 label1.Text = "bla"。另一件事可能是,标签的 autosize 通常设置为 true。 label1.AutoSize=true;。然后至少在这里看起来还不错。 :)
  • 我希望标签停靠和填充。标签被放置在 TableLayoutPanel 的单元格中,但是当我在设计器中查看它们时,我不再看到我通常在每个单元格周围所做的“边界线”。
【解决方案2】:

不要更改设计器代码。那东西是自动生成的。您的更改不仅会导致意外行为,而且还会被覆盖。

我会尝试对您的表单或您的设计师所支持的任何内容进行更改或 2,并希望它重新生成所有代码。

【讨论】:

    【解决方案3】:

    您可以在设计器中删除所有图片框,然后在_load事件(或其他方便的事件)中添加所有标签。这样下次改起来就方便了。

    【讨论】:

      【解决方案4】:

      正如 Haxx 所示,您还必须清理 PictureBox 所需的额外初始化。您收到的错误是接口转换错误。在您的情况下,正如 Haxx 猜测的那样,Label 控件没有实现 ISupportInitialize 接口。

      与大多数人不同,我不怕为了权宜之计而更改设计器代码,对于您正在做的事情,这样做是可以的。只需了解您的对象,在此之前签入,不要将自定义代码放入其中!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-04
        • 1970-01-01
        • 1970-01-01
        • 2013-10-06
        相关资源
        最近更新 更多