我看到很多页面和问题涉及将值从一个表单传递到另一个表单。我想做一些不同的事情。不是值,而是整个表单,作为参数传递。请注意,这不是MDI表格。
我有一个带有2个按钮的父表单。一个按钮创建一个Child1表单。另一个(可选)按钮调用另一个子窗体编辑器。
第一个按钮是一个验证按钮,如果有效,则调出Child1表单,其中listviewbox填充了键/值对。 第二个是带有自己按钮的编辑器。如果按下其中一个(提交)按钮,则应使用新的keyvaluepair更新第一个Child1表单。
我遇到的问题是我似乎无法获得Child1表单以反映更改。我不知道更新这个Child1表单的最佳方法是什么。我已经尝试过使用EndUpdate的BeginUpdate,并刷新它,现在所有的尝试,我已经有点迷失了。我希望有人可以帮助我。
我真正想做的是刷新ChildForm1,说它是收件箱,当某些内容被“保存”或从第二个子窗体编辑器添加时。使用按钮单击第二个子窗体编辑器,第一个Childform应该刷新。
父母表格:
public ChildForm1 MyboxofValues;
private void btn1_Click(object sender, EventArgs e)
{
MyboxofValues = new ChildForm1();
MyboxofValues.Show();
}
private void btn2_Click(object sender, EventArgs e)
{
Editor myEditor = new Editor();
myEditor.Show();
}
ChildForm1:
public ChildForm1()
{
InitializeComponent();
updateMe();
}
public void updateMe()
{
listView1.Items.Clear();
if (MainCode.subRows.Count > 0)
{
foreach (KeyValuePair<string, string> element in MainCode.subRows)
{
ListViewItem lvi = new ListViewItem(element.Value);
lvi.SubItems.Add(element.Key);
listView1.Items.Add(lvi);
}
}
}
EditorForm:
private ChildForm1 originalForm = new ChildForm1();
private void btnSubmit_Click(object sender, EventArgs e)
{
originalForm.updateMe();
}
我确信这很容易,但我无法得到它。如果有人可以帮助它将不胜感激,节省我几个小时!如果有更好的方式来更新提交结果也没关系,请举例说明吗?
出于测试目的,我为ChildForm1创建了一个“刷新”按钮,该按钮有效! (它实际上只调用了updateMe()。所以我认为这是一种奇怪的事情,我正在创建一个新的表单实例并尝试更改这个不存在的(null)表单而不是实际的ChildForm1。但我想刷新listviewBox来自编辑表格。
答案 0 :(得分:1)
不是让Editor
成为父表单的“子”形式,而是使其成为ChildForm
(也就是父母的孙子)的子表单。当然,既然你没有使用MDI,这只是解决问题的合理方式,仅此而已。
不要让父母创建Editor
,而是让ChildForm
创建它。单击父表单的第二个按钮后,它会调用CreateEditor
ChildForm
之类的方法。当它创建编辑器时,它显然可以存储它以供以后的交互。
如果父表单需要对Editor
执行任何其他操作,则可以通过ChildForm
来执行此操作。
答案 1 :(得分:0)
我建议不要从另一个表单更新一个表单,而是将工作数据存储在像视图模型这样的对象中,并始终从中刷新表单。
查看对WinForms应用程序有用的MVP模式。
答案 2 :(得分:0)
很大程度上是通过Servy的敏锐帮助。我不知道这是否可以帮助别人,所以这里对我有用。:
父窗体,MyBox,根据我之前认为以前是ChildForm1的方式:
public MyBox()
{
InitializeComponent();
updateMe();
}
public void updateMe()
{
listView1.Items.Clear();
if (MainCode.subRows.Count > 0)
{
foreach (KeyValuePair<string, string> element in MainCode.subRows)
{
ListViewItem lvi= new ListViewItem(element.Value);
lvi.SubItems.Add(element.Key);
listView1.Items.Add(lvi);
}
}
}
private void btnCreateEditor_Click(object sender, EventArgs e)
{
plainTextEditor editor = new plainTextEditor(this);
Form1.editorOpen = true;
editor.Show(this);
}
此表单有一个按钮,可以调用现在看起来像这样的编辑器表单:
public partial class Editor : Form
{
private MyBox listviewBoxForm;
public Editor(listviewBoxForm _form1)
{
InitializeComponent();
inboxForm = _form1;
}
}
实际上很简单,但没有立即看到它。我让它变得比代表所需要的更复杂等。这很简单,似乎对我有用。