![](/img/trans.png)
[英]How to create a shared object across all controls that appears at the bottom of Visual Studio Winforms designer?
[英]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中的控件庫項目中。 如果沒有,你應該能夠稍微調整方向以使其工作,但是當控件在自己的項目中時更容易。
請執行下列操作:
注意:這意味着當您運行解決方案時,它將啟動另一個Visual Studio實例,而不是實際運行您的解決方案。 Visual Studion的第一個實例(INSTANCE_1)將在您運行時“托管”Visual Studio的第二個實例(INSTANCE_2)。
注意:這將確保即使在try塊中命中INSTANCE_1也會在任何運行時錯誤時發生故障。
您應該發現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.