Member 12545398 Ответов: 1

C# - обработчик событий-передача значения из одной формы в другую


Привет!
Я создал делегат и событие и пытаюсь подписаться на событие на form1, но оно не получает subscibe, если я перемещу код подписки на событие в form2, то проблем нет. может ли кто-нибудь найти меня, плз. заранее спасибо::::


_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);

                }
            }


Что я уже пробовал:

Я представил код и изо всех сил старался выяснить, в чем заключается проблема, которую я не могу понять. плз плз помоги мне

johannesnestler

а-а-а ... так в чем же опять проблема? Не могли бы вы (плз, плз) попытаться сформулировать свой вопрос/проблему немного лучше?

1 Ответов

Рейтинг:
0

OriginalGriff

Ну...это довольно просто понять.
Вы создаете экземпляр Form3 в Form1 и прикрепляете обработчик:

frm3 = new Form3();
frm3.ListViewUpdated += new ListViewUpdatedEventHandler(Frm3_ListViewUpdated1);
Но вы никогда не показываете форму, поэтому фактический Listview никогда не обновляется.
И наоборот, в Form2 вы создаете экземпляр Form3 и показываете его, но никогда не прикрепляете обработчик:
Form3 frm3 = new Form3(dr);
frm3.Show();

Таким образом, эта версия получает обновление ListView и (предположительно, вы не показываете, что она это делает) сигнализирует о событии, но у вас нет обработчика, поэтому ничего не происходит.

Взгляните на это: Передача информации между двумя формами, Часть 2: Ребенок-Родитель[^]
Пример кода должен показать вам, что делать.


Member 12545398

Спасибо за ответ Дорогой!

занимаюсь разработкой оконного приложения POS. Требование таково: когда пользователь нажимает на кнопку "seach item" на _mainform(форма 1), то он открывает _Searchform(форма 2) и на форме поиска отображает результат в listview с кнопкой select item на form3 и закрывает _searchform(форма 2). Элемент, который мы выбрали из listview, мы добавляем в _mainform (form1) listview.

Я пытаюсь реализовать эту функциональность с помощью делегата и события. На form3 (форма результатов поиска) я объявил делегат и событие и подписался на это даже на form1 (основная форма).


В этом решении u предоставлено от ребенка к родителю, но есть 3 формы.

OriginalGriff

Это неправильный способ.
Form1 не знает о Form3 - и не должен знать, если Form2 открывает окно.
И если форма 2 закроется... это плохой дизайн!

Вместо этого создайте событие результатов в Form2, которое обрабатывает Form1.
Form2 сигнализирует о событии и либо закрывается, либо нет, как ему заблагорассудится.
Form1 обрабатывает событие и в обработчике извлекает информацию из Form2, создает Form3 и передает ему необходимые данные.
Таким образом, форма поиска не должна знать, что делается с результатами, а основная форма не должна знать, как форма результатов отображает их.

Member 12545398

Поэтому я должен создать событие в form2, а не в form3,и form1 обработает это событие, значит, подпишет его. В этой функции дескриптора (на форме 1) мне нужно создать форму 3 и отобразить данные и выбрать после этого>

OriginalGriff

Да!

Member 12545398

Но мое требование заключается в том, что из формы 1 я нажимаю поиск, и он открывает форму 2, а из формы 2, Когда я ввожу элемент no, он показывает результат в форме 3, и я хотел бы выбрать элемент из формы 3, чтобы показать в форме 1.

если я создаю событие в форме 2 и обрабатываю его в форме 1, Как я узнаю, какой элемент пользователь выбрал в форме 3

OriginalGriff

Потому что форма 3 говорит Это форме 1, а не форме 2! Форма 2 закрыта этой стадией, помнишь? Так как же он мог что-то сказать Форме1?

Form1 создает Form2 и подписывается на событие "SearchResults". Затем он показывает форму 2.
Form2 сигнализирует о событии и закрывается.
Form1 получает событие, и в обработчике он создает Form3, передает ему Результаты поиска из Form2 и подписывается на это событие "ItemSelected". Затем он показывает форму 3.
Form3 ждет пользователя и сигнализирует "ItemSelected". Form1 получает событие,и в обработчике он запрашивает Form3 для элемента.
Понимаете, что я имею в виду?