Visual C#2008を使用してこのC#アプリをハッキングして数日間過ごした後、次のような一連のエラーダイアログが表示されます。
プロパティ 'valueMember'のコード生成に失敗しました。
エラーは次のとおりです: 'オブジェクト参照はオブジェクトのインスタンスに設定されていません。'
これは、デザイナーに小さな変更を加えたときによく起こります。コントロールを数ピクセルシフトし、保存してみます。そのようなエラーダイアログが毎秒表示され、VSを閉じるためにalt-F4を取得しようとしているときにEnterキーを押すことでそれらすべてをキャンセルすることに忙しくしています。
最終的には、VSを閉じて、行った変更を保存します。 VSを再起動した後、プロジェクト全体を「クリーン」にし、「ビルド」してすべてが正常に機能し、アプリは問題なく実行されます。
フォームデザイナでもう少し変更を加えるまで。
アプリのどのプロパティvalueMember
も知りません。
これは私を夢中にさせます、それは私のプロジェクトの本当のショートッパーです。どんな助けでもありがたいです。
これは設計時に発生しているため、デフォルトを持たないパラメーターまたはその他の値を必要とするカスタムコントロールがある可能性があります。
Visual Studioのデザインビューの場合。ビジュアルエディターでレンダリングするためにコントロールインスタンスが作成されますが、コントロールをレンダリングする前にプロパティを設定する必要がある場合、エラーが発生します。
すべてのカスタムコントロールにデフォルト値があり、デフォルトを持つことができないコンストラクターで参照されるものはすべてDesignMode
プロパティでラップされていることを確認できます-参照 http://msdn.Microsoft.com/en- us/library/system.componentmodel.component.designmode.aspx 。
Visual Studioを閉じて再度開いてみます。ばかげているように見えるかもしれませんが、うまくいきます。
別のビジュアルスタジオを使用してデザイナーをデバッグし、プロセスにアタッチできます。例外が発生した場合は、その方法で簡単に見つけることができます。一般に、デザイナーを開くと、コンストラクターともちろんinitializeComponentが実行されます。
@Chanipozの答え(閉じる/再開く)と同様に、メインのフォームデザイナーウィンドウを閉じた後、コンポーネントが豊富でユーザーコントロールがどこでもあるフォームアプリが正常にコンパイルを開始しました。
私はこのコードスタックを何年も使っており、今日までエラーを見たことがありません。それがどこから来ているのかわからない。しかし、今日、デザイナーでフォームを開いていることで、すべてが不幸になりました。画面から閉じるだけで、すべてがスムーズに進みます。
Visual Studioの別のインスタンスを使用して、Visual Studioの最初のインスタンスに接続します。
Debug-> Attach To Processに移動して、devenv.exeプロセスを探します。 2つのdevenv.exeプロセスが実行されているので、IDが小さい方のプロセスを選択することになるでしょう。これは通常、実行されたVisual Studioの最初のインスタンスです。
問題は、コントロールのパブリックプロパティの初期化コードが不足していることです。これは、コントロールをデザイナーに追加するときに追加されますが、コントロールを派生コントロールに置き換えるか、コンポーネントを更新すると、デザイナーはこれに対処する方法を知りません。
パブリックプロパティPropertyAを持つコントロール(wincontrol)があり、それをフォーム(myForm)に追加すると、デザイナーはプロパティに必要なすべての初期化をmyForm.Designer.csに追加します。何かのようなもの;
Wincontrol1.PropertyA = new List<widget>();
コントロールを少し変更する必要があることは珍しくありません。新しいコントロールMyWinControlがあるとしましょう
public partial class MyWinControl : WinControl
{
public List<wodget> PropertyDer1;
protected List<wodget> PropertyDer2;
}
MyForm.Designer.csの古いコントロールをこの新しいコントロールにサブバイすると、この問題が発生する可能性があります。これは、WinFormsデザイナでPropertyDer1が初期化されていないためです。 PropertyDer2は保護されているため、問題は発生しません。同様に、カスタムコンポーネントがあり、コンポーネントがフォームに追加された後に新しいパブリックプロパティを追加した場合。
ただし、フォーム上のWinControlのインスタンスを削除し、代わりにMyWinControlのインスタンスをフォームにドラッグした場合、適切な初期化が行われ、エラーは表示されません。デザイナーはこのような新しいコントロールを作成します
Wincontrol1.PropertyA = new List<widget>();
Wincontrol1.PropertyDer1= new List<wodget>();
デザイナーからプロパティを隠す必要のない2つの簡単なソリューションがあります。 1.プロパティをパブリックにする必要がない場合は、適切な修飾子を指定します。2。プロパティをパブリックにする必要がある場合は、myForm.Designer.csのコードを上記のコードのように編集して、不足しているコードを追加します初期化子
私はこの問題に直面しなければなりませんでした。解決策(多くの継承)が見つからないので、.SuspendLayout()
と.ResumeLayout()
がコードまたはその1つにない可能性があります。 .BeginInit()
と.EndInit()
についても同様です。それらの間には、= new ...
およびプロパティのいくつかの設定。たぶん、この問題に直面している誰かがこの情報で解決策を見つけるでしょう。