[英]C# -Event Handler -Passing value from one form to another
我正在开发窗口应用程序POS。 要求是:当用户单击_mainform(form 1)
上的'seach item'
按钮时,它会打开_Searchform(form2)
并在搜索表单上将结果显示在listview
,并在form3上选择项目按钮,然后关闭_searchform(form2)
。 我们从listview
选择的项目,我们添加到_mainform(form1) listview
。
我尝试使用委托和事件来实现此功能。 在form3
(搜索结果表单)上,我已经声明了委托和事件,甚至在form1(主表单)上也进行了订阅。 但是,当我在form 1
点上运行应用程序事件时,会被解雇。
遵循以下代码:
_mainform(form1):
namespace KasseDelegate
{
public delegate void ListViewUpdatedEventHandler(object sender, ListViewUpdatedEventArgs e);
public partial class Form1 : Form
{
private Form3 frm3;
public Form1()
{
InitializeComponent();
frm3 = new Form3();
frm3.ListViewUpdated += new ListViewUpdatedEventHandler(Frm3_ListViewUpdated1);
}
private void Frm3_ListViewUpdated1(object sender, ListViewUpdatedEventArgs e)
{
MessageBox.Show("hi");
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Show();
}
}
}
_searchform(form2) :
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
using (SQLiteConnection con = new SQLiteConnection(Properties.Settings.Default.ConnectionString))
{
con.Open();
SQLiteCommand cmd = new SQLiteCommand("select * from varer where varenummer=@Varenummer", con);
cmd.Parameters.AddWithValue("@Varenummer", "101");
SQLiteDataReader dr = cmd.ExecuteReader();
Form3 frm3 = new Form3(dr);
frm3.Show();
}
}
}
表格3:
namespace KasseDelegate
{
public partial class Form3 : Form
{
public event ListViewUpdatedEventHandler ListViewUpdated;
SQLiteDataReader dr1;
public Form3()
{
InitializeComponent();
}
public Form3(SQLiteDataReader dr)
{
InitializeComponent();
dr1 = dr;
}
private void Form3_Load(object sender, System.EventArgs e)
{
if (dr1 != null)
{
while (dr1.Read() == true)
{
ListViewItem LVI = new ListViewItem();
LVI.SubItems.Add(dr1[0].ToString());
LVI.SubItems.Add(dr1[1].ToString());
LVI.SubItems.Add(dr1[2].ToString());
LVI.SubItems.Add(dr1[3].ToString());
LVI.SubItems.Add(dr1[4].ToString());
listView1.Items.Add(LVI);
}
}
}
private void button2_Click(object sender, System.EventArgs e)
{
string sVareNummer = listView1.SelectedItems[0].SubItems[1].Text;
string sBeskrivelse = listView1.SelectedItems[0].SubItems[2].Text;
string pris = listView1.SelectedItems[0].SubItems[4].Text;
string enpris = listView1.SelectedItems[0].SubItems[5].Text;
if (ListViewUpdated != null)
{
ListViewUpdated(this, new ListViewUpdatedEventArgs() { VareNummer1 = sVareNummer, Beskrivelse1 = sBeskrivelse, Pris1 = pris, Enpris1 = enpris });
}
}
}
public class ListViewUpdatedEventArgs : System.EventArgs
{
private string VareNummer;
private string Beskrivelse;
private string pris;
private string enpris;
public string VareNummer1
{
get
{
return VareNummer;
}
set
{
VareNummer = value;
}
}
public string Beskrivelse1
{
get
{
return Beskrivelse;
}
set
{
Beskrivelse = value;
}
}
public string Pris1
{
get
{
return pris;
}
set
{
pris = value;
}
}
public string Enpris1
{
get
{
return enpris;
}
set
{
enpris = value;
}
}
}
}
因此,我如何才能从list3(displayitem)到form1。(mainform)获取listview选定项的值。
如果我理解正确的话,你有Form1
-这将启动Form2
进而开启Form3
。 选择Form3
上的某些项目后,您需要将其更新回Form1
。
因此,在Form1
上声明一个委托。 将此委托传递给Form2
[ Form2
构造函数应将此作为默认参数接受-这样,如果从其他地方触发了Form2
则我们不必对委托具有硬依赖性。
在Form2
上维护此委托类型的私有变量,并在启动Form3
将相同的委托传递给Form3
构造函数。
在Form3
上,现在有了委托,该委托持有对From1
方法的引用,因此,每当选择一个项目时,都可以在Form3
上分配该委托,这将在Form1
上触发该方法。
所以这是一个可行的例子。
public delegate void MyDelegate(string selectedItem);
public class Form1
{
private MyDelegate delegate1;
public Form1()
{
delegate1 = new MyDelegate(ShowSelectedItem);
var form2 = new Form2(delegate1);
}
public void LaunchForm2()
{
}
private void ShowSelectedItem(string result)
{
}
}
public class Form2
{
private MyDelegate form2Delegate;
public Form2(MyDelegate del = null)
{
form2Delegate = del;
var form3 = new Form3(form2Delegate);
}
public void LaunchForm3()
{
}
}
public class Form3
{
private MyDelegate form3Delegate;
public Form3(MyDelegate del = null)
{
form3Delegate = del;
SelectedItemTriggered("tes");
}
public void SelectedItemTriggered(string selectedItem)
{
form3Delegate(selectedItem);
//This will trigger method ShowSelectedItem of Form1
}
}
您可以在Form3
设置一个事件,然后像这样从外部访问它:
public partial class Form2 : Form
{
public Form2()
{
Form3 new3 = new Form3();
// Access the event of form3 from outsite
new3.DisplayedItemChanged += ItemChanged;
}
public void ItemChanged(object sender, EventArgs e)
{
// This will be triggered.
}
}
public class Form3 : Form
{
// Create an event
public event EventHandler DisplayedItemChanged;
public void button1_Click(object sender, EventArgs e)
{
if (this.DisplayedItemChanged != null)
{
// Raise the event and pass any object
this.DisplayedItemChanged(yourObjectToPass, e);
}
}
}
根据您的以下评论:
public partial class Form1 : Form
{
public Form1()
{
// This one is an instance of Form3
Form3 newForm = new Form3();
newForm.SomethingHappens += RaiseHere;
}
public void RaiseHere(object sender, EventArgs e)
{
// Do something...
}
}
public partial class Form2 : Form
{
public Form2()
{
// This one is NOT the same as on Form1. Its a NEW form.
Form3 newForm = new Form3();
newForm.Show();
}
}
public partial class Form3 : Form
{
public event EventHandler SomethingHappens;
public Form3()
{
//...
}
}
这是行不通的,永远不会。 您必须使用相同的实例:
Form3 newForm = new Form3();
newForm.SomethingHappens += RaiseHere;
newForm.Show();
如果您无法解决此问题,对不起:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.