我有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(表单所有者) 其中T:表格
static public T GetInstance(表单所有者,bool closeAllButThis) 其中T:BaseForm
static public T GetInstance(表单所有者,bool closeAllButThis,params object [] args) 其中T:表格
现在要获得我做过的任何形式的新实例:
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); } 其他 { openForm = SingletonFormProvider.GetInstance(parentFrm,closeAlreadyOpened,loadEntityId); }
保护我的默认构造函数并从中删除所有内容:
受保护的AnyForm() {}
制作另一个带有一个参数的构造函数:
public AnyForm(long?loadEntityId) { 长? AnyFormID = LoadEntityId.Value; 的InitializeComponent(); //我需要的所有东西 }
对我来说这很有意义。我很怀疑这是实现这一目标的方法。所以请查看并指导我正确的方法。当然,如果这是以某种方式正确的方式请验证,因为我有疑问是否可以将它放在生产代码中。
P.S
正如Matthew Watson
提到的那样,表单在没有默认构造函数的情况下表现得很奇怪,所以我最终得到一个默认(无参数)构造函数,另一个接受一个参数 - 我需要的ID。这更糟糕,现在我有重复的代码。我很确定这不是它的完成方式。