0

私はMDI Formsアプリケーションを持っSingletoneFormProviderており、一度にフォームのインスタンスを 1 つだけ持つ必要があるため、使用しています。

新しいレコードの作成または既存のレコードの変更に使用できる編集フォームがあります。問題は、既存のレコードの編集にあります。

私がこれまでに行ったこと:

  • クラスから静的メソッドを呼び出し、SingletoneProviderFormフォームの新しいインスタンスを取得するメソッドがあります。

        protected void LoadForm<T>(ToolStripItem formButton, string buttonText, long? loadEntityId = null, bool closeAlreadyOpened = true) where T : BaseForm
    {
             //Some code..
             openForm = SingletonFormProvider.GetInstance<T>(parentFrm, closeAlreadyOpened);
             openForm.LoadEntityId = loadEntityId;
             openForm.MdiParent = parentFrm;
             openForm.Dock = DockStyle.Fill;
             openForm.Show();
             openForm.Activate();
             //More code..
    

    }

  • の 3 つの宣言がありSingletonFormProvider.GetInstance<T>ます。

    static public T GetInstance(フォーム所有者) T : フォーム

    static public T GetInstance(Form owner, bool closeAllButThis) T : BaseForm

    static public T GetInstance(Form owner, bool closeAllButThis, params object[] args) where T : Form

  • これまで、フォームの新しいインスタンスを取得するために、次のことを行いました。

    LoadForm();

  • Id を送信したい場合は、次のようにします。

    LoadForm(ID);

そして、ここで問題が発生します。フォーム フィールドに、提供された ID を持つレコードのデータを入力しようとするため、クエリを作成します。

entity = anyForm.Find(LoadEntityId.Value);

そして、私がイベントでそれをしている間、これらすべては実際にうまくいきましたform_load. しかし今、コンストラクターでこの部分を移動するたびに、チェックを行います:

if (LoadEntityId.HasValue)

フォームインスタンスが構築される方法では、コンストラクターからIDにアクセスできないように見えるため、決してありません。

私がしたこと :

  • LoadForm()メソッドを次のように変更しました。

    if (loadEntityId == null) { openForm = SingletonFormProvider.GetInstance(parentFrm, closeAlreadyOpened); } else { openForm = SingletonFormProvider.GetInstance(parentFrm, closeAlreadyOpened, loadEntityId); }

  • デフォルトのコンストラクターを保護し、そこからすべてを削除します:

    保護された AnyForm() {}

  • 1 つの引数を取る別のコンストラクターを作成しました。

    public AnyForm(long? LoadEntityId) { long? AnyFormID = LoadEntityId.Value; InitializeComponent(); //必要なものすべて }

ですから、それが機能することは私にとって驚くべきことでした。これがこれを達成する方法であることに大きな疑問があります。したがって、これを行う正しい方法を確認してガイドしてください。そしてもちろん、これがどういうわけか正しい方法である場合は、検証してください。これを製品コードに入れてもよいかどうか疑問があるからです。

PS

前述Matthew Watson のように、フォームはデフォルトのコンストラクターなしでは奇妙な動作をするため、1 つのデフォルト (引数なし) コンストラクターと 1 つの引数 (必要な ID) を取る別のコンストラクターになります。さらに悪いことに、コードが重複しています。私はそれがどのように行われていないと確信しています。

4

0 に答える 0