2017-02-22 8 views
0

Это мой первый файл, Form1.cs:Как мы можем использовать модель событий и делегирования для передачи вывода из метода в первом классе в другой класс?

namespace EventsNDelegates 
    { 
    public delegate void DelEventHandler(); 

    public partial class Form1 : Form 

    { 
    public event DelEventHandler add; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     add += new DelEventHandler(Initiate); 
     //invoke the event 
     add(); 
    } 
    public void Initiate() 
    { 
     textBox1.Text = "Hello"; 
    } 
    } 
} 

и это мой второй файл Class1.cs:

namespace EventsNDelegates 
{ 
class Class1 
{ 

} 
} 

и это моя форма дизайн:

enter image description here

Теперь в данный момент на кнопке нажмите событие, которое запускается в форме1.

Что мне нужно, так это то, что события активируются при нажатии кнопки form1.cs в class1.cs, и вывод выводится в текстовое поле формы1.

+0

Если класс1 не имеет ссылки на form1, он не может сделать это напрямую. Но я предполагаю, что существует еще один класс (возможно, просто программа), который содержит ссылки для обоих классов; вам придется работать в этом классе для передачи информации. – Kilazur

+1

Я не понимаю. Вы хотите вызвать событие в form1 из класса 1 или подписаться на событие в классе1 и вызвать его в form1? –

+0

оба эти класса находятся под одним и тем же пространством имен. форма находится в form1.cs, где у нас также есть текстовое поле и кнопка. теперь, когда я нажимаю кнопку в form1.cs, он должен запускать событие в class1.cs, и я хочу, чтобы цикл выполнялся в этом событии (например, счетчик до 1 до 20), и я хочу, чтобы все эти значения от 1 до 20 отображались в текстовое поле form1.cs @Kilazur –

ответ

0

Если вы должны подписаться на событие из другого класса, и показать результат в form1 классе вы можете попробовать это:

public class Class1 
{ 
    public void Foo(Form1 form) // Method with your cycle in class1 
    { 
     for(int i = 0; i < 100; i++) 
     { 
      var str = i.ToString(); // Write iterator in local inloop variable for correct capture in lambda 
      form.add +=() => // subscribe on form1 event 
      { 
       Thread.Sleep(10); 
       return str; 
      }; 
     } 
    } 
} 

public delegate string DelEventHandler(); // change return type to string 

public partial class Form1 : Form 
{ 
    public event DelEventHandler add; 
    public Class1 class1; 

    public Form1() 
    { 
     InitializeComponent(); 
     class1 = new Class1(); 
     class1.Foo(this); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     foreach (var handler in add.GetInvocationList().Cast<DelEventHandler>()) // Get all subscribers for correct invoke 
     { 
      textBox1.Text = handler(); // invoke all subscribers and write result to textBox1 
      Refresh(); 
     } 
    } 
} 

Вы можете передать экземпляр Form1 в class1, чтобы подписаться на его события. Кроме того, вы не должны просто вызывать событие. Вы должны быть call all subscribers of event при нажатии кнопки формы1. Не забудьте скопировать итератор в захват в цикле, чтобы избежать incorrect operations в цикле класса 1.

+0

все хорошо, за исключением того, что он печатает от 0 до 99 всех вместе. мне нужен счетчик. как 0 приходит идет 1 приходит и следует до 99 и останавливается. –

+0

Я обновил свой ответ. Добавлен «Thread.Sleep» для имитации задержки. И добавил метод «Обновить», чтобы перерисовать форму. Но лучше использовать асинхронный вызов в таких случаях. Это ты имеешь ввиду? –

+0

ах @ Иван Кищенко обновляется, но старый контент не идет. Мне нужен выход как: 0 затем 1 затем . . наконец только 100 в текстовом поле Но я получаю 0 1 2 3 ... 100 все вместе –

Смежные вопросы