13

winForms "myForm"を作成すると、次のボイラープレートコードが生成されます。

public partial class myForm: Form
{
    public myForm() 
    {

       //<<position 1

       InitializeComponent();

       //<<position 2

    } 
}

コンストラクターメソッドにコードを追加した場合、コードを位置1または2に配置すると、アプリの実行に違いはありますか?

4

5 に答える 5

18

はい、そうです。

InitializeComponentVSが生成するメソッドであり、フォーム上のコントロールの作成と配置を担当します。

「位置1」のコードは、コントロールが存在する前に実行されます。この位置でコントロールにアクセスしようとすると、NullReferenceException(たとえば、のコンテンツを設定しようとするとTextBox)が表示されます。「位置2」の同様のコードは期待どおりに機能します。

ただし、「位置1」には使用法があります。フォームのプロパティに依存するカスタムコントロールまたは動作がある場合、それらのプロパティを「位置1」に設定すると、それらの前にコントロールを作成できるようにすると、コードを更新できなくなる可能性があります。値が設定されます。

于 2012-08-15T08:07:38.887 に答える
3

はい。InitializeComponentの前は、すべてのコントロールがまだ作成されていません。

于 2012-08-15T08:07:19.760 に答える
2

関数InitializeComponent(); グラフィックレイアウトに配置するすべてのオブジェクトを作成します。それらにアクセスしたい場合は、コードをposition2に配置する必要があります。

于 2012-08-15T08:07:13.097 に答える
1

button、、textboxcombobox付けると、Form自動的にコードが作成されます。このコードは、で生成されます 。InitializeComponent()

したがって、フォームに配置したコントロールを呼び出すのposition 1間違っています。これは、コードのその時点でコントロールが作成されることがないためです。

フォームに配置したコントロールを呼び出してアクセスできます。position 2

于 2012-08-15T08:55:41.640 に答える
0

ここで他の人が言っているように、ほとんどの場合、位置2を使用する必要があります。ただし、どちらの位置も機能しないという例外があり、実際にはコードを別のイベントに添付する必要があります。

例:ScrollViewerとその中に画像があります。大きな画像ファイルを画像コンポーネントに挿入し、画像の中央が最初に表示されるように表示したい場合は、スクロールして残りの画像を表示するオプションを使用します。

scrollViewer1.ScrollToVerticalOffset(scrollViewer1.ScrollableHeight / 2);

ただし、これをInitializeComponent()の前または後(またはでさえ)のコンストラクターに書き込むと、希望する結果が得られません。(コンポーネントはこの段階で初期化されていますが、含まれているイメージファイルは初期化されていないためです。)代わりに、新しいイベントハンドラー ImageOpenedイメージにアタッチし、そこにコマンドを記述します。

ImageOpened EventHandler

于 2016-02-18T11:24:01.310 に答える