0

我有MDI Forms应用程序并且我使用SingletoneFormProvider它,因为它一次只需要一个表单实例。

我有可用于创建新记录或更改现有记录的编辑表单。问题在于现有记录的编辑。

到目前为止我所做的:

  • 我有一个从类中调用静态方法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..
    

    }

  • 我有以下三个声明SingletonFormProvider.GetInstance<T>

    static public T GetInstance(Form owner) where T : Form

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

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

  • 到目前为止,为了获得任何形式的新实例,我这样做了:

    加载表格();

  • 如果我想发送一个 ID,那么只需:

    加载表格(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() {}

  • 制作了另一个接受一个参数的构造函数:

    public AnyForm(long?LoadEntityId) { long? AnyFormID = LoadEntityId.Value; 初始化组件();//我需要的所有东西}

所以它的工作对我来说太神奇了。我很怀疑这是实现这一目标的方法。因此,请查看并指导我正确执行此操作。当然,如果这在某种程度上是正确的方法,请验证,因为我怀疑是否可以将其放入生产代码中。

附言

如前所述Matthew Watson ,表单在没有默认构造函数的情况下表现得很奇怪,所以我最终得到了一个默认(无参数)构造函数,而另一个采用了一个参数——我需要的 ID。更糟糕的是,现在我有重复的代码。我很确定这不是它的做法。

4

0 回答 0