簡體   English   中英

Visual Studio WinForms設計器不實例化對象

[英]Visual Studio WinForms designer does not instantiate object

我創建了一個派生自System.Windows.Forms.ContextMenuStrip類的類,而不是用戶控件,只是一個帶有構造函數和一個事件處理程序的普通.cs類。

當我將這個類從工具箱拖到設計器上時,它會為它創建一個私有成員和幾個屬性,但不會實例化一個對象。

因此,在運行時我得到“對象引用未設置為對象的實例。”,因為設計者從不生成該行:

this.searchGridContextMenu1 = new SearchGridContextMenu();

在InitializeComponent中。

它曾用於生成這一行,事實上,我一直將它從我的Vault存儲庫中重新插入,但設計師只是“再次”使用它。

更新:我現在嘗試使用相同的類創建用戶控件,它只是這樣做有同樣的問題。

我在另一個問題上交叉發表了這條評論,但由於這與此相關,因此它又是。

當用戶控件無法加載到Visual Studio設計器中時,您需要執行此操作。 這些指令適用於vb.net項目,但c#應該類似。 此外,在此之前關閉所有打開的窗口(或至少您正在處理的控件的源和設計器文件。)

最后一件事。 您應該做的第一件事是確保重新啟動visual studio不能解決問題。 如果沒有,您可以嘗試以下步驟。 這些說明假定錯誤的用戶控件位於visual studio中的控件庫項目中。 如果沒有,你應該能夠稍微調整方向以使其工作,但是當控件在自己的項目中時更容易。

請執行下列操作:

  1. 使控件庫成為您的啟動項目。
  2. 打開控件庫項目的屬性,然后單擊調試選項卡。
  3. 在“開始操作”下,單擊“啟動外部程序”選項並瀏覽到Visual Studio可執行文件。

注意:這意味着當您運行解決方案時,它將啟動另一個Visual Studio實例,而不是實際運行您的解決方案。 Visual Studion的第一個實例(INSTANCE_1)將在您運行時“托管”Visual Studio的第二個實例(INSTANCE_2)。

  1. 運行您的解決方案 INSTANCE_2將加載。
  2. 切換回INSTANCE_1。
  3. 在INSTANCE_1中按CTRL-ALT-E。 這將打開例外對話框。 選中Common Language Runtime Exceptions旁邊的THROWN列復選框。

注意:這將確保即使在try塊中命中INSTANCE_1也會在任何運行時錯誤時發生故障。

  1. 切換到INSTANCE_2。 在解決方案資源管理器中,雙擊以打開錯誤的用戶控件。

您應該發現INSTANCE_1 OF Visual Studio應該停在導致設計者不加載控件的代碼行上。 修復代碼(這通常意味着在引用對象屬性之前測試IsNot Nothing ......但可能意味着其他事情。)

此外,有時我發現控件將在INSTANCE_2中加載,而不是在INSTANCE_1中打破錯誤。 在這種情況下,只需停止調試...關閉INSTANCE_2。 保存/重新啟動INSTANCE_1,您的問題通常會消失。

這是經驗教訓。 用戶控件必須能夠加載/引用所有對象及其成員,以便將其加載到設計器中。 因此,對於將放置在其他容器上的用戶控件,我通常會設計事件來通知父級,而不是嘗試將對象推送到子控件中。

希望這有助於將來參考這個老問題。

賽斯

我讀過這個嗎? Visual Studio是否刪除構造控件實例的行?

你的構造函數是公開的嗎? 在某些時候,我將構造函數的可訪問性從公共更改為內部 - 試圖變得更好,阻止討厭的用戶訪問他們不應該訪問的東西 - 然后我遭受了與您描述的相同的影響,我不得不添加我的構造函數回到InitializeComponent。

我花了幾個月才意識到自己的錯誤......只是一直認為這是Visual Studio中的一個錯誤。 將其更改回公眾並沒有問題。

當InitializeComponent()與基本和繼承的組件交叉時,會發生此問題。 解決方案是調用組件的設計者方法。 否則將調用基本方法。

 public Form() { this.InitializeComponent(); // base.InitializeComponent <-- default one is thisone } 

繼承控制是不夠的。 這是我必須實現的最低限度才能使其工作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WinForms
{
    class Foo : System.Windows.Forms.ContextMenuStrip
    {
        public Foo()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
        }

        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }

        #endregion
    }
}

將無參數構造函數從內部更改為公共已解決了該問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM