繁体   English   中英

C#-事件处理程序-将值从一种形式传递到另一种形式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM