You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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控件。已全面排查源码,未发现任何可能触发该报错的逻辑,无法定位问题成因。

参考材料

报错信息截图

添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:21:10