一个数据列表,每行数据有一唯一标识ID,点击一行可进入修改界面(frm_Edit),
现在需要可以同时打开多编辑界面,以标识ID来过滤相关详细内容。
现在项目设计的情况如下:
所有的界面Form继承自一个baseForm.
如何最简洁的完成这个功能?我的部分实现:
ImspGlobal.listFormID 为全局List<string> //没有则初始化返回一个编辑框,有则直接返回存在的编辑框
public static Frm_base OpenSomeForm<T>(object[] parameters) where T : Frm_base
{
Frm_base openForm = null;
object obj = parameters.Count() > 0 ? parameters[parameters.Count() - 1] : null;
if (!ImspGlobal.listFormID.Contains(obj.ToString()))
{
openForm=(T)Activator.CreateInstance(typeof(T), parameters);
}
else
{
foreach (Form form in Application.OpenForms)
{
if(form is T)
{
var data = form as T;
if (data.FormCode == obj.ToString())
openForm = data;
}
}
}
return openForm;
}界面上部分代码: //存在直接获取焦点,不存在,添加其编号入集合并打开显示listFormID为Frm_base的附加属性
private void btnShow_Click(object sender, EventArgs e)
{
var frmEdit = (Frm_Edit)ImspPubFun.OpenSomeForm<Frm_Edit>(new object[] { orderId, null, "06001" + (orderId).ToString() });
if (!ImspGlobal.listFormID.Contains("06001" + (orderId).ToString()))
{
ImspGlobal.listFormID.Add("06001" + (orderId).ToString());
frmEdit .OnFormClosed += new EventHandler<CloseFormArgs>(frm_OnFormClosed);
frmEdit .Show();
}
else
{
frmEdit .Activate();
}
}我觉得自己想法有些乱,功能可以实现,但这样的界面很多,修改地方也多,特别是那个关闭frmEdit刷新问题,我注册了个事件来处理,那很多编辑界面都要加,有更简洁的方法吗?
现在需要可以同时打开多编辑界面,以标识ID来过滤相关详细内容。
现在项目设计的情况如下:
所有的界面Form继承自一个baseForm.
如何最简洁的完成这个功能?我的部分实现:
ImspGlobal.listFormID 为全局List<string> //没有则初始化返回一个编辑框,有则直接返回存在的编辑框
public static Frm_base OpenSomeForm<T>(object[] parameters) where T : Frm_base
{
Frm_base openForm = null;
object obj = parameters.Count() > 0 ? parameters[parameters.Count() - 1] : null;
if (!ImspGlobal.listFormID.Contains(obj.ToString()))
{
openForm=(T)Activator.CreateInstance(typeof(T), parameters);
}
else
{
foreach (Form form in Application.OpenForms)
{
if(form is T)
{
var data = form as T;
if (data.FormCode == obj.ToString())
openForm = data;
}
}
}
return openForm;
}界面上部分代码: //存在直接获取焦点,不存在,添加其编号入集合并打开显示listFormID为Frm_base的附加属性
private void btnShow_Click(object sender, EventArgs e)
{
var frmEdit = (Frm_Edit)ImspPubFun.OpenSomeForm<Frm_Edit>(new object[] { orderId, null, "06001" + (orderId).ToString() });
if (!ImspGlobal.listFormID.Contains("06001" + (orderId).ToString()))
{
ImspGlobal.listFormID.Add("06001" + (orderId).ToString());
frmEdit .OnFormClosed += new EventHandler<CloseFormArgs>(frm_OnFormClosed);
frmEdit .Show();
}
else
{
frmEdit .Activate();
}
}我觉得自己想法有些乱,功能可以实现,但这样的界面很多,修改地方也多,特别是那个关闭frmEdit刷新问题,我注册了个事件来处理,那很多编辑界面都要加,有更简洁的方法吗?
devmiao
(苏小喵)能说的详细点吗?
我所有的业务界面都继承自这个基础界面。
主要问题是,这个OpenSomeForm方法之前是无返回值,直接显示界面的,但因为保存成功后主界面刷新问题,所以返回一个编辑界面。导致代码增加了很多。
{
listBox1.Items.AddRange(new String[] { "1", "2", "a", "b" });
} private void listBox1_DoubleClick(object sender, EventArgs e)
{
String strName = listBox1.Text;
if (!String.IsNullOrEmpty(strName))
{
Boolean bOpen = false;
foreach (Form f in Application.OpenForms)
{
if (f.Name == strName)
{
bOpen = true;
f.BringToFront();
break;
}
} if (!bOpen)
{
Form f = new Form();
f.Name = strName;
f.Text = strName;
f.Show();
}
}
}
SocketUpEx我有20个左右这样的列表界面,每个界面这么加代码有点恼火啊。
而且之后关闭此编辑界面,主界面要刷新数据的。
1、编辑窗体需要增加一个属性DataID,用于标识数据的唯一值;
2、当父窗体需要编辑时,判断打开的编辑窗体有无DataID相同的,若有,将其激活,否则。创建编辑窗体,赋值,包括刷新父窗体的回调;
3、在父窗体中定义回调函数原型,刷新回调函数传回的DataID值那行的数据;我觉得每个列表界面只需要2个窗体就可以了,一个父窗体,一个编辑窗体。