如何在c#中的窗体之间传输对象

我在Windows窗体中获得了一个ListView。当表单加载ListView加载personel对象时。 我希望当一些用户双击ListView时,从ListView.SelectedItem属性获取personel对象并打开一个新表单并将此对象传输到新打开的表单。

这是我将个人对象加载到ListView的代码:

public static void GetAll(ListView list) { list.Items.Clear(); using (FirebirdEntityz context = new FirebirdEntityz()) { ObjectQuery query = context.PERSONEL; foreach (var item in query) { var mylist = new ListViewItem { Text = item.NAME }; mylist.SubItems.Add(item.SURNAME); mylist.Tag = item; list.Items.Add(mylist); } } } private void Form1_Load(object sender, EventArgs e) { GetAll(listView1); } 

这是我转移的个人对象:

 private void listView1_SelectedIndexChanged(object sender, EventArgs e) { PERSONEL personel = (PERSONEL)listView1.SelectedItems[0].Tag; } 

在将要打开的新表单中,在表单类中添加一个新属性;

 private PERSONNEL Personnel{get; set;} public ShowPersonnel(PERSONNEL _personnel){ this.Personnel = _personnel; //do whatever you want here } 

在主要forms;

 private void listView1_SelectedIndexChanged(object sender, EventArgs e){ PERSONNEL personnel = listView1.SelectedItems[0].Tag as PERSONNEL; Form2 form2 = new Form2(); form2.ShowPersonnel(personnel); form2.Show(); } 

可能包括拼写错误。 将人员更改为PERSONEL。

您可能只需将一个公共PERSONEL属性添加到表单中,然后在SelectedIndexChanged事件处理程序中设置该属性。 然后,任何有权访问您的选择器表单的代码都可以访问您自定义的选定PERSONEL属性。

  • 一种方法是像米斯蒂克因素所暗示的那样拥有公共产品。
  • 或者你可以有一个参数化的ctor并传递Personnel对象。 虽然,这可能会在Visual Studio中的窗体设计视图中产生一些问题。

您应该能够设置listview控件的显示成员。 在你进入for循环之前做类似的事情:

 list.DisplayMember = "Name" 

然后绑定对象。

 list.DataSource = query.ToList() 

所选项目将为您提供绑定的对象…

 MessageBox.Show(((PERSONEL)list.SelectedItem).Name); 

这就是它在.net 2.0中的工作方式。 但我相信在3.0及更高版本中可能有一种方法可以做到这一点……