4

私が作業しているアプリケーションには、多くの共有機能を備えた多数のフォームがあります。たとえば、各フォームにはDataGridView、同じボタンの多く、同じUIコードの多くなどがあります。

この共通フォームのベースバージョンを作成してこれを実装し、これらすべての非常に類似しているがまったく同じではない子フォームにサブクラス化して、それぞれに必要な追加のコントロールと機能に取り組みたいと思います。そのうちの。

protectedアンカーなどが適切に機能するようになるため、ベースフォームのコントロールを作成するのに役立つことはすでに理解しています。ただし、派生フォームを基本フォームと同じサイズに自動的に作成する方法はまだ見つかりません。

経験によれば、これを行う簡単な方法があるはずです。派生フォームを作成した直後に、必要なサイズをすべて手作業で入力することはそれほど問題ではありませんが、すべてをできるだけクリーンでシンプル、そして自動化したいと思います。

4

3 に答える 3

4

派生フォームが基本フォームからサイズを自動的に継承しないのは興味深いことです。これは、何もしなくても機能するはずだからです。

問題の疑わしい原因:

問題は、VisualStudioのフォームデザイナを使用してフォームを編集していることが原因であると思われます。フォームを編集するたびに、WindowsフォームデザイナはフォームのInitializeComponentメソッドで必要なコードを生成します。生成されたすべてのコードの中には、基本フォームのサイズと同じであっても、フォームのサイズを設定する割り当てがあります。したがって、派生フォームの作成後に基本フォームのサイズを変更した場合でも、派生フォームを基本フォームと同じサイズにする場合は、これらの割り当てを手動でコメントアウトする必要があります。(ただし、それがコントロールの配置とレイアウトにさらに問題を引き起こす可能性があるかどうかはわかりません。)

// Code to be commented out in your derived form's InitializeComponent method:
this.AutoScaleDimensions = new System.Drawing.SizeF(...);
this.ClientSize = new System.Drawing.Size(...);

これらの行がコメント化されると、ベースフォームで設定されたサイズInitializeComponentが派生フォームに使用されます。

回避策:

フォームを編集するたびにデザイナーが生成したコードを手動でコメントアウトする必要がないように、次の操作を実行できます。

基本フォームから派生したフォームを作成します。それを呼びましょうFrozenBaseForm。他のすべてのフォームは、基本フォームから直接ではなく、このクラスから派生します。ここで、この「中間」クラスで、新しいプロパティを定義しますClientSize

public class FrozenBaseForm : BaseForm
{
    new public SizeF ClientSize
    {
        get { return base.ClientSize; }
        set { }
    }
}

これにより、すべての割り当てClientSizeはまったく効果がなくなり、基本フォームのサイズが保持されます。これは実を言うとハックのように感じますが、うまくいくようです。Sizeところで、同じ方法でプロパティを非表示にする必要があるかもしれません。

前述のように、フォームを直接からではFrozenBaseFormなく、から派生させます。BaseForm

public class DerivedForm1 : FrozenBaseForm { ... }
public class DerivedForm2 : FrozenBaseForm { ... }
...

別のオプション(他のすべてが失敗した場合の最後の手段):

最後の手段として、Forms Designerのことを忘れて、派生フォームをコードエディターで手動で定義するだけで済みます(個人的にはこれを行いたくありませんが)。

public class DerivedForm : BaseForm
{
    public DerivedForm()
    {
        // make all necessary changes to the base form:
        ...
    }
}
于 2010-02-12T14:20:38.433 に答える
0
public partial class derivedForm : baseForm
{
    public derivedForm()
    {
        InitializeComponent();

        this.Width = base.Width;
        this.Height = base.Height;
    }
}
于 2010-02-12T13:52:34.263 に答える
0

BaseFormにそれ自体のサイズを設定させてみませんか?

public partial class BaseForm : Form
{
    public BaseForm()
    {
        InitializeComponent();

        // you could hardcode these or retrieve these values from a
        // config file or something
        this.Width = 640;
        this.Height = 468;
    }
}

これはあなたが望むことをしませんか?

于 2010-02-12T14:07:23.640 に答える