C# WinForms设计器添加PartUC等UserControl报错求助
WinForm自定义UserControl设计器加载异常问题
问题现象
- 私人项目开发到某一阶段时,部分自定义UserControl从窗体设计器界面消失,但项目运行时这些控件可正常显示:所有异常控件均已在
Form1.Designer.cs文件中完成声明、初始化并添加到窗口容器。 - 初期误判为界面显示类临时Bug未做处理,后续需要基于这些UserControl开展可视化界面设计工作时,必须修复该问题。
- 尝试往窗体添加
PartUC控件新实例时,弹出篇幅较长的报错信息;该报错不仅在添加PartUC时触发,添加全新创建的空白UserControl时也会出现。但添加AmpPropertiesUC、PartPropertiesUC两个UserControl时完全正常:并非仅1-2个控件异常,而是除这两个控件外,其余所有UserControl都无法在设计器中添加。
已尝试的排查与修复操作
- 未找到可行解决方案后,新建全新项目重构窗体,参考原项目
Form1.Designer.cs文件中控件的名称、位置、尺寸、颜色等配置信息,加快重构进度。 - 完成主窗体和
PartUC控件的重设计后,将可正常使用的AmpPropertiesUC和PartPropertiesUC复制到新项目目录,生成项目后两个控件正常显示在工具箱中。 - 先在设计器中将上述两个正常可用的UserControl添加到窗体,再尝试添加重新制作的
PartUC到新窗体时,依然收到相同报错;目前可以正常添加全新的空UserControl,但始终无法添加PartUC控件。已全面排查源码,未发现任何可能触发该报错的逻辑,无法定位问题成因。
参考材料
报错信息截图

旧项目窗体运行效果
红色标记为PartUC控件,蓝色为修改了部分属性的PartUC实例,绿色标记的属性面板对应PartPropertiesUC控件:
相关源码
PartUC UserControl主文件源码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ActiveFilterSimulator { public delegate void PartUCEventHandler(PartUC sender); public partial class PartUC : UserControl { public event PartUCEventHandler PartClicked; private string _partName { set; get; } public string PartName { set { _partName = value; if ((_partType == "Open") || (_partType == "Connection")) lName.Text = ""; else lName.Text = _partName; } get { return _partName; } } private double _partValue { set; get; } public double PartValue { set { _partValue = value; ScientifficValue scientifficValue = ScientifficValue.ParseValueToScientifficValue(value); if ((PartType == "Open") || (PartType == "Connection")) lValue.Text = ""; else lValue.Text = scientifficValue.BareValue.ToString() + GetExtension(_partType, scientifficValue.ValueScientiffic); } get { return _partValue; } } private string _partType { set; get; } public string PartType { set { _partType = value; switch (_partType) { case "Connection": PartSymbolPannel.BackgroundImage = Image.FromFile(getPrivateImageFolder() + "Connection.png"); break; case "Resistor": PartSymbolPannel.BackgroundImage = Image.FromFile(getPrivateImageFolder() + "Resistor.png"); break; case "Capacitor": PartSymbolPannel.BackgroundImage = Image.FromFile(getPrivateImageFolder() + "Capacitor.png"); break; case "Inductor": PartSymbolPannel.BackgroundImage = Image.FromFile(getPrivateImageFolder() + "Inductor.png"); break; default: //Open Connection / Not Connected _partType = "Open"; PartSymbolPannel.BackgroundImage = Image.FromFile(getPrivateImageFolder() + "Open.png"); break; } PartName = _partName; PartValue = _partValue; } get { return _partType; } } public PartUC() { InitializeComponent(); PartName = ""; PartValue = 1.0f; PartType = "Open"; } private void InvokeClickedEvent(object sender, EventArgs e) { PartUCEventHandler handler = PartClicked; handler?.Invoke(this); } private string getPrivateImageFolder() { string CurrentDir = Directory.GetCurrentDirectory(); CurrentDir = CurrentDir.Replace(@"bin\Debug\net6.0-windows", @"PartSymbols\"); return CurrentDir; } private string GetExtension(string type, int scientiffic) { string scientifficCharacter; switch (scientiffic) { case 18: scientifficCharacter = "E"; //Exa break; case 15: scientifficCharacter = "P"; //Peta break; case 12: scientifficCharacter = "T"; //Tera break; case 9: scientifficCharacter = "G"; //Giga break; case 6: scientifficCharacter = "M"; //Mega break; case 3: scientifficCharacter = "k"; //kilo break; case 0: scientifficCharacter = ""; //1 break; case -3: scientifficCharacter = "m"; //milli break; case -6: scientifficCharacter = "µ"; //micro break; case -9: scientifficCharacter = "n"; //nano break; case -12: scientifficCharacter = "p"; //pico break; case -15: scientifficCharacter = "f"; //femto break; case -18: scientifficCharacter = "a"; //atto break; default: scientifficCharacter = "*"; //Unit prefix out of range break; } switch (_partType) { case "Connection": return ""; case "Resistor": return scientifficCharacter + "Ω"; case "Capacitor": return scientifficCharacter + "F"; case "Inductor": return scientifficCharacter + "H"; default: return ""; } } } }
PartUC.Designer.cs设计器自动生成源码
namespace ActiveFilterSimulator { partial class PartUC { /// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源。 /// </summary> /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Component Designer generated code /// <summary> /// 设计器支持所需的方法 - 不要修改 /// 使用代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { this.PartSymbolPannel = new System.Windows.Forms.Panel(); this.lName = new System.Windows.Forms.Label(); this.lValue = new System.Windows.Forms.Label(); this.SuspendLayout(); // // PartSymbolPannel // this.PartSymbolPannel.Location = new System.Drawing.Point(0, 0); this.PartSymbolPannel.Name = "PartSymbolPannel"; this.PartSymbolPannel.Size = new System.Drawing.Size(75, 75); this.PartSymbolPannel.TabIndex = 0; // // lName // this.lName.AutoSize = true; this.lName.Font = new System.Drawing.Font("Open Sans Light", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); this.lName.Location = new System.Drawing.Point(81, 5); this.lName.Name = "lName"; this.lName.Size = new System.Drawing.Size(57, 23); this.lName.TabIndex = 1; this.lName.Text = "lName"; // // lValue // this.lValue.AutoSize = true; this.lValue.Font = new System.Drawing.Font("Open Sans Light", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); this.lValue.Location = new System.Drawing.Point(81, 28); this.lValue.Name = "lValue"; this.lValue.Size = new System.Drawing.Size(53, 23); this.lValue.TabIndex = 2; this.lValue.Text = "lValue"; // // PartUC // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.lValue); this.Controls.Add(this.lName); this.Controls.Add(this.PartSymbolPannel); this.Name = "PartUC"; this.Size = new System.Drawing.Size(200, 75); this.ResumeLayout(false); this.PerformLayout(); } #endregion private Panel PartSymbolPannel; private Label lName; private Label lValue; } }
内容的提问来源于stack exchange,提问作者HElectronix
相关产品推荐
相关产品推荐

