最近搞一个小玩意
需要窗体1的listviwe取值 拿到窗体2的listviwe去用
这事情就有点麻烦了
要直接new那个窗体 窗体里的控件那是根本连点都点不出来的
怎么做呢
问了老师和网上一些大牛得到以下解决方案
1.可以改窗体里面控件里的安全级别
.net的默认级别是私有 控件也是私有
只需要改变控件的级别为public公开级别
或者要使用某个控件事件或者方法都可以这样干
2. 就是使用事件来传递
先来一个委托 然后在取值的窗体做成一个Event事件
在自己需要传送值的地方(也许是一些控件事件)给他调用下事件
把要传的值进去
再在使用值的窗体中 写上一个使用这个值的方法
然后在要取值的控件事件中调用取值窗体里的那个传值的Event事件
这个事件里传入我们这个使用值的方法
OK 你就可以随意的调用取值窗体里的值了
注意 委托里的参数 限定了你取值 和使用值里面方法和事件的参数类型
以下为实例:
//这里我先做一个委托 委托的参数是listviweitem 类型的 listviwe的一个项
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public delegate void SendAddMusicForBoxHandler(ListViewItem lvi);
}
//在取值窗体中 我用这个委托做一个SendAddMusicForBoxEvent事件出来
//当“添加ToolStripMenuItem”这个右键菜单选项单击的时候
//触发事件 并取值listviweitem lvi 这个和我们上面事件需要的参数一致
//我们可以直接将它传入事件中
using System.Windows.Forms;
using WindowsApplication1.Modle;
using System.Data.SqlClient;
using WindowsApplication1.DAL;
using WindowsApplication1.BLL;
namespace WindowsApplication1
{
public partial class frmMain : Form
{
public event SendAddMusicForBoxHandler SendAddMusicForBoxEvent;
ListViewItem lvi=new ListViewItem();
private void 添加ToolStripMenuItem_Click(object sender, EventArgs e)
{
lvi = listViewMusic.SelectedItems[0];
if (SendAddMusicForBoxEvent != null)
{
SendAddMusicForBoxEvent(lvi);
}
}
}
第三步就简单了 调用那个窗体 再使用事件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class PlayMusicBox : Form
{
public PlayMusicBox()
{
InitializeComponent();
}
private void PlayMusicBox_Load(object sender, EventArgs e)
{
//窗体加载后 new一个取值界面 当取值界面那个右键菜单单击后触发我们做的那个
//SendAddMusicForBoxHandler事件 那个事件中已经有了我们传的值
//这边在用这个事件 调用下面做的使用值的那个方法
frmMain f = new frmMain();
f.Show();
f.SendAddMusicForBoxEvent +=new SendAddMusicForBoxHandler(FilllistView);
}
//这里写一个如何使用取到的值的方法
我这里把取到的listviwe打乱 重新放入当前窗体里的listviwe
public void FilllistView(ListViewItem lvi)
{
ListViewItem l = new ListViewItem();
l.Text=lvi.Text;
for (int i = 1; i < lvi.SubItems.Count; i++)
{
l.SubItems.Add(lvi.SubItems[i].Text);
}
listView1.Items.Add(l);
}
}
}
有以上我们等于说变相的进行了不同窗体中 值进行传递