タイトルのエラーに関する質問があります。 C#とVisual Studio 2010を使用しています。
「パブリッククラスFormularioGeneral:Form」として宣言されたフォームがあります。これは、アプリケーションの残りのフォームのベースです。デザイナービューにアクセスしようとすると、画像に示されているように、このエラーが数回表示されます。
すべてのエラーは、InitializeComponentメソッド内の行を参照します。ここで、値は次のようなプロパティに割り当てられます。
[...]
this.PanelMargenIzquierdoCapaBase.BackColor = m_ColorCapaBase;
[...]
しかし、すべての変数は読み取り専用プロパティと同じクラスで宣言され、それらはすべてコンストラクターで呼び出されるメソッド内で割り当てられます。
プロパティの宣言:
protected Color m_VariableName;
public Color VariableName
{
get { return m_VariableName; }
set { }
}
コンストラクターコード:
public FormularioGeneral()
{
ConfigurarUI();
AccionesConstructor();
InitializeComponent();
PostInicializacionComponentes();
EstablecerIcono();
InicializarLocalizacionFormulario();
}
ConfigurarUIメソッド:
public virtual void ConfigurarUI()
{
[...]
m_AltoBordeSuperiorCapaBase = 30;
m_AltoBordeInferiorCapaBase = 7;
m_AnchoBordesLateralesCapaBase = 7;
m_ColorCapaBase = Color.FromArgb(50, 100, 150);
m_ColorTextoCapaBase = Color.White;
m_ColorTextoBotonAplicacion = Color.Black;
m_FuenteTextoIzquierdoCapaBase = new System.Drawing.Font("Verdana", 11.0F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
m_FuenteTextoCentroCapaBase = new System.Drawing.Font("Verdana", 14.0F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
[...]
}
だから、私が知る限り、エラーを与えているすべての変数は正しく宣言されており、InitilizeComponent関数が呼び出される前に値が割り当てられています。
私はこの時点で立ち往生し、問題を解決するために何をすべきかわからない。皆さんの何人かがこの問題を助けてくれることを願っています。
だから、私は過去に同じ問題を抱えていましたが、修正のために次のことをしました:
Marshall Belew! に感謝します
私のプロジェクトはx64のみであるため、このエラーに遭遇しました。どうやら32ビットアプリケーションであるVisual Studioは、デザイナーで64ビットにコンパイルされたフォームやコントロールを読み込むことができません。それはまったく理にかなっていますが、エラーは問題であることを示しません。
答え から x64のVisual Studioデザイナーが機能しない を参照してください。
回避策は、設計時にプロジェクトを任意のCPUに変更し、ビルド時に元に戻すことです。
おそらく、コンストラクターコードが原因でエラーが発生します。次のように、コンストラクタの先頭にInitializeComponent();
を配置します。
public FormularioGeneral()
{
InitializeComponent();
ConfigurarUI();
AccionesConstructor();
PostInicializacionComponentes();
EstablecerIcono();
InicializarLocalizacionFormulario();
}
説明:
変数はそのメソッドで初期化されます。
私の場合、InitializeComponents()
が次のように開始された古いWindowsフォームプロジェクトがありました。
_private void InitializeComponent()
{
var componentResourceManager = new ComponentResourceManager(typeof(MyForm));
...
_
これにより、後でInitializeComponent()
内のcomponentResourceManager
にアクセスしたときにエラーメッセージが表示されました。
変数 'componentResourceManager'は宣言されていないか、割り当てられていません。
新しく作成されたフォームと比較すると、1つの点を除いて、非機能フォームに似ていることがわかりました。
変数の名前はcomponentResourceManager
ではなく、単にresources
でした。
ソリューション
変数の名前をresources
という名前に変更した後、すべてが正常に機能します。
Visual Studio 2017のWindowsフォームデザイナーは、フォームを正しく開きました。
私は同じ問題を抱えていて、掃除と再構築はうまくいきませんでした。
私の場合、問題はVisual Studioデザイナーが.csprojファイルで指定された<HintPath>ディレクトリからロードするのではなく、GACから参照されたDLLをロードすることが原因でした。 GACのDLLには、ローカルに保存されたDLLと同じバージョンがありませんでした。
GACのDLLを更新して同じバージョンを使用すると、すべてが正常に機能しました。
ユーザーコントロールのランタイムリソースに関連するいくつかのコードがコンストラクターにあったときに、この問題が発生しました。 nullチェックを追加して修正しました。
InitializeComponent();
if (MyConfig!= null)
{
this.label2.Text = MyConfig.text1;
this.label3.Text = MyConfig.text2;
this.label1.Text = MyConfig.text3;
}
ユーザーコントロールに問題が発生し、すべての提案を試みた後、(ソリューションに焦点を合わせ、Alt + Enter)ソリューションの変更プラットフォームターゲットから- x64 to Any CPは問題を解決しました。
Windows Forms内でWPFを使用しています。
Windows Forms Element HostでWPFユーザーコントロールをホストしました。そのため、InitializeComponent()が呼び出されたときに、WPFコントロールのInitializeComponent()に到達する前にコードを実行しました。トリッキー。
それで、コンストラクター、Clean Build、Rebuild、Restart VSからそれを移動し、すべてが期待どおりに動作します。最後に。
私の場合、ツールバーにサードパーティコントロールを追加し(.dllファイルを使用)、フォームの1つを描画します。そして、何らかの理由で、私のツールバーはこのサードパーティのコントロールを一般的なグループから削除します(一般的なグループに追加しました)ので、VSはこのコントロールを見つけることができません。この問題を解決するために私がしたことは次のとおりです。
必要に応じてコントロールを再描画します。
このエラーは、フォームコンストラクターから呼び出されるInitializeComponent()でサードパーティコントロールを作成しているときに発生します。 InitializeComponent()の後に作成したとき、それはうまく機能します。
public MyForm() //Form constructor
{
InitializeComponent();
//Create/initialize third party control here with new operator
}
コンストラクタにInitializeComponent();
以外のものを入れないでください。そこからコードをLoad()
などのイベントに配置できます。
変数については、単に宣言で変数を初期化できますか?後で値を変更しても、それで十分だと思います。私が見ていることから、コンパイラはコンストラクタコードに直接ないため、それらを初期化したかどうかを確認することができません、それはランタイム
したがって、代わりに:
protected Color m_VariableName;
public Color VariableName
{
get { return m_VariableName; }
set { }
}
行う:
protected Color m_VariableName = Color.White; // Or null
public Color VariableName
{
get { return m_VariableName; }
set { }
}
また、コメント:コンストラクターでの仮想呼び出しは避ける必要があります。これにより、アプリケーションで不明瞭なエラーが発生する可能性があります。それを確認してください こちら 。
変数componentResourceManagerの名前をリソース解決済みエラーに変更しました。
残念ながら、Telerikレポートデザイナーのデザイナーを働かせるために、他のアイテムを大量に変更する必要がありました
私のソリューションでは、.csprojファイルで修正した間違った参照パスがありました。それを修正した後、最終的にフォームを再び読み込むことができました。
最初に、デザイナーが(何らかの理由で)ロードできなかった型を参照するコードがありました。それから、ローカルのラップトップから実行できなかったコードをコンストラクターに入れました。ロジックをLoadイベントに移動し、コンポーネントがDesignModeであるかどうかを確認し、ある場合は終了することが最善の選択肢であると判断しました。
デザイナーがメソッドの後半にある型をJITしようとしたため、これでさえ十分ではなかったので、別のメソッドに移動して、それが起こらないようにしなければなりませんでした。基本的に私がやったことは次のとおりです。
private void userControl_Load(object sender, EventArgs e)
{
if (DesignMode) return;
Initialize();
}
private void Initialize()
{
// do your work
}
this SO answer に感謝します。これは、LoadイベントになるまでDesignModeプロパティにアクセスしないというブログ投稿のコメントを示してくれました...