C# 对象与目标类型不匹配

C# 对象与目标类型不匹配,c#,.net,winforms,label,picturebox,C#,.net,Winforms,Label,Picturebox,我有一个TableLayoutPanel,里面有一个PictureBox控件的网格。我试图找到一种快捷方式,将它们全部更改为标签控件,而不是手动删除每个控件并在每个单元格中放置新控件 我原以为我可以进入设计器代码,用标签查找/替换PictureBox,但现在我得到了一个 “对象与目标类型不匹配” Visual Studio的错误列表中出现错误。我现在也无法查看设计器页面。这是不允许的吗?如果允许,正确的方法是什么?不要更改设计器代码。这些东西是自动生成的。您的更改不仅会导致意外行为,而且还会被改

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

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

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


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

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


我会尝试对您的表单进行一次或两次更改,或者您的设计器支持的任何更改,并希望它重新生成所有代码。

您可以删除设计器中的所有图片框,然后在加载事件(或另一个方便的事件)中添加所有标签。这样,下次更改将更容易。

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

标签1

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";
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;
图片box1

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";
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();
这不起作用,并导致设计师的问题<代码>对象与目标类型不匹配。

因此,应用已做的更改,删除以下行:

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

而且我认为您可以开始了。

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


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

这就是为什么你不直接编辑设计器文件的原因…@Servy-那就是,下次你向控件添加/调整大小/执行任何操作时,你所有的更改都将被删除。meh,我无法计算我在设计器代码中快速更改某些内容的次数。如果你知道你在做什么,就没有问题了。您可能遗漏了设计器代码中的某些内容。只需仔细检查您的更改,我敢打赌这是您看过的一些小东西。我试图找到一种快速的“查找并替换”方法,将窗体上的所有控件从一种类型更改为另一种类型,而不必手动删除设计器上的每个控件并创建新控件。请查看底部的示例。标签未实现
ISupportInitialize
,这会导致出现错误。因此,删除您尝试将标签强制转换为
ISupportInitialize
的行,您的设计器将执行以下操作:)标签不需要调用BeginInit()?如果是这样,你能解释一下吗?谢谢不,检查BeginInit上的文档“向对象发出初始化开始的信号”。对于不实现
ISupportInitialize
接口的控件,这是不可能的(当然也不需要)。错误消失了,我可以再次看到设计器表单,但它看起来与我预期的不太一样。但是错误确实消失了!啊,也许你还需要添加一个文本:)
label1.Text=“bla”
。另一个可能是,标签的autosize通常设置为true<代码>标签1.AutoSize=true。那么至少在这里看起来还不错。:)我要标签停靠并填充。标签被放置在TableLayoutPanel的单元格中,但当我在designer中查看它们时,我不再看到通常在每个单元格周围所做的“边界线”。