我有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。更糟糕的是,现在我有重复的代码。我很确定这不是它的做法。