2

この長い話で申し訳ありませんが、質問はそれに値すると思います。

私が作成したカスタム コントロールがあります。OnPaintBackgroundこれには、メンバーBrushPen. 私は次のように作成していました:

CustomControl c = new CustomControl();
c.Parent = someParent;

コンストラクターは、ブラシとペンと背景用のものを作成するためのものが追加されたデフォルトのものでした。

ただし、親パネルを使用するコンストラクターを使用する方がよいと考えたので (親がないとコントロールを使用できないため)、コンストラクターにパラメーターを 1 つ追加しました。

public CustomControl(Control parent) {
    InitializeComponent();
    Parent = parent;
    // do a bunch of stuff like getting brushes, pens, etc for drawing the background
}

次に、プログラムを実行すると、最初のコントロールが作成され、正常に描画されました。次に、最初のコントロールの後のすべてのコントロールで、最初のチャンスの例外が発生し、コントロールSystem.Drawing.dllのすべてのパネルの背景が、画像などが見つからないときに Winforms が表示する赤でした。ただし、作成するコントロールの最初のインスタンスは完全に機能していたことを思い出してください。X

そのため、ログに記録するだけでなく、例外がスローされたときに Visual Studio が中断するように設定し、オーバーライド内の次のOnPaintBackgroundような行で中断しました。

e.Graphics.DrawLine(bPen, x, y, Width, Height);

情報とともにArgument cannot be null。そこで、デバッガー ウィンドウを調べたところ、bPennull であるだけでなく、コンストラクターが呼び出されていても、すべてのブラシとペン、およびすべてが null であることがわかりました (MessageBox で確認)。

最終的に、デフォルトのコンストラクターからパラメーターを削除し、引数を取る別の別のコンストラクターを追加し、そのコンストラクターからデフォルトの ctor を呼び出すことで問題を解決しました。しかし、私は知りたいのですが、コントロールが s のようなものを作成できないようにするデフォルトのコンストラクターを持たないことに対して、C# は何を持っているPenのでしょうか?

4

2 に答える 2

3

この質問に対するいくつかの有用な回答があります: C# のパラメーターを使用した 'UserControl' コンストラクター

于 2011-05-23T16:10:53.477 に答える
2

C#はコントロールに対して何もありません、それは気にしません。それはただの言語です。設計者はデフォルトのコンストラクターに依存しているため、通常はデフォルトのコンストラクターが必要になります。実際、このようなものは私にとってはうまく機能します:

public class MyControl : Control
{
    private Control _parent;
    public MyControl()
    {
        InitializeComponent();
    }

    public MyControl(Control parent) : this()
    {
        _parent = parent;
    }
}
于 2011-05-23T16:08:52.383 に答える