我不知道如何正确地做到这一点。
基本的是,我有一个表单,用于填写各种数据,我保存在2个列表。第二个表单是通过菜单选项调用的表单,菜单选项显示所有当前数据的概述。它像这样打开:
private void OpenOverviewForm()
{
Overview formOverview = new Overview();
for (int i = 0; i < callListNL.Count; i++)
{
ListViewItem item = new ListViewItem(callListNL[i].Opco);
item.SubItems.Add(callListNL[i].UserID);
item.SubItems.Add(callListNL[i].Email);
item.SubItems.Add(callListNL[i].Title);
formOverview.listView1Overview.Items.Add(item);
}
for (int i = 0; i < callListPL.Count; i++)
{
ListViewItem item = new ListViewItem(callListPL[i].Opco);
item.SubItems.Add(callListPL[i].UserID);
item.SubItems.Add(callListPL[i].Email);
item.SubItems.Add(callListPL[i].Title);
formOverview.listView1Overview.Items.Add(item);
}
formOverview.StartPosition = FormStartPosition.CenterScreen;
formOverview.Show();
}
在这个新表单中,有一个列表视图,其中包含所有保存的日志。我想要的是最终用户能够双击其中一个条目,然后关闭第二个表单并显示他们在第一个表单上选择的数据。为了做到这一点,我需要能够使用listview的双击事件来提供项目的索引,他们已经双击到我的功能之一,存在于第一种形式。然而,我找不到一种方法来获得我的功能从Form1识别在我的Form2。
我知道这是可能的:
public partial class Overview : Form
{
public Overview()
{
InitializeComponent();
}
private void listView1Overview_DoubleClick(object sender, EventArgs e)
{
Form1 newform = new Form1();
newform.OverviewFormDisplay(listView1Overview.SelectedIndices[0]);
}
}
但是由于这段代码实际上创建了我的原始表单的一个全新的实例,我不认为这是可用的。还是我错了?
为你的主表单实例创建一个变量
并以引用Form1
为参数添加Overview
的构造函数
public partial class Overview : Form
{
private Form1 _mainForm;
public Overview(Form1 mainform) : this()
{
this._mainForm = mainForm;
}
private void listView1Overview_DoubleClick(object sender, EventArgs e)
{
this._mainForm.OverviewFormDisplay(listView1Overview.SelectedIndices[0]);
}
}
然后你可以在你的Overview
表单中使用Form1
实例的所有public
属性和方法
创建Overview
表单实例时,将主表单的引用传递给构造函数
//.....this line must be in the Form1
Overview formOverview = new Overview(this);
//....
您也可以通过在Overview表单中创建一个Property来解决这个问题:
public partial class Overview : Form
{
public Overview()
{
InitializeComponent();
}
private ListViewItem lvi;
public ListViewItem SelectedItem
{
get
{
return lvi;
}
set
{
lvi = value;
}
}
private void listView1Overview_DoubleClick(object sender, EventArgs e)
{
SelectedItem = listView1Overview.SelectedItems[0];
Close();
}
}
你必须编辑创建formOverview的代码,使其看起来像这样:
private void OpenOverviewForm()
{
Overview formOverview = new Overview();
for (int i = 0; i < callListNL.Count; i++)
{
ListViewItem item = new ListViewItem(callListNL[i].Opco);
item.SubItems.Add(callListNL[i].UserID);
item.SubItems.Add(callListNL[i].Email);
item.SubItems.Add(callListNL[i].Title);
formOverview.listView1Overview.Items.Add(item);
}
for (int i = 0; i < callListPL.Count; i++)
{
ListViewItem item = new ListViewItem(callListPL[i].Opco);
item.SubItems.Add(callListPL[i].UserID);
item.SubItems.Add(callListPL[i].Email);
item.SubItems.Add(callListPL[i].Title);
formOverview.listView1Overview.Items.Add(item);
}
formOverview.StartPosition = FormStartPosition.CenterScreen;
formOverview.ShowDialog();
if (formOverview.SelectedItem != null)//just in case the user closes formOverview without double-clicking any item
{
OverviewFormDisplay(formOverview.SelectedItem);
}
}
如果你不想让你的formOverview在每次用户双击一个项目来执行你想要的功能时关闭,这可能不是最好的方法,但它确实在工作。希望能有所帮助:)