Я хочу использовать событие и делегата для написания текста в RichTextBox. Я использую темы с BackGroundWorker, и мне нужен делегат. Я нашел этот пример, который отлично работает для меня, это 1 класс, который создает делегат, событие и функцию множественного числа, и другой файл, который является формой. Рабочий класс:
namespace SolucionRichTextBox
{
class Work
{
//delegado
public delegate void work(string notificacion);
//evento
public event work working;
//metodo trabajando
public void trabajando()
{
for(int i = 0; i <= 100; i++)
{
if (i % 2 == 0)
working(i.ToString());
}
}
}
}
И файл формы, который это.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnEmpezar_Click(object sender, EventArgs e)
{
Work w = new Work();
//Delegado que tiene el metodo notificar
w.working += new Work.work(notificar);
//Creamos un nuevo hilo y cuando se crea llama a la funcion trabajando
Thread t = new Thread(w.trabajando);
//Inicia el hilo
t.Start();
}
//Metodo que se ejecutara en otro hilo y escribe en el box
public void notificar(string notificacion)
{
if (InvokeRequired)
Invoke(new Action(() => richTextBox1.Text += notificacion +"\n"));
}
}
}
Теперь я пытаюсь экстраполировать на мою реальную проблему, и я не понимаю, почему это не работает. Я сделал это.
//Escribir con un delegado en el richTextBox
//Creo un delegado de la clase
private delegate void delegado(string notificaciones);
//Creo un evento del delegado
private event delegado Evento;
//Asocio el evento al metodo notificar
Evento += new delegado(notificar);
public void notificar(string notificacion)
{
if (InvokeRequired)
Invoke(new Action(() => BoxText.Text += notificacion + "\n"));
}
//Boton enviar. Empieza la funcion en segundo plano, y al llamar a RunWorker llama a Dowork.
private void enviar_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
//inicia el proceso
backgroundWorker1.RunWorkerAsync();
}
}
Событие + = новый делегат (уведомление); В этой строке выдается ошибка. Имя Событие не существует в текущем контексте. Новый уведомитель не подходит для этого элемента и (уведомить) тип имен не был идентифицирован. Я был здесь в течение нескольких дней и нескольких вопросов, и это казалось лучшим решением, но я был с C # 2 недели и никогда не обрабатывал темы (они доставляют мне много головной боли). И что я действительно хочу, так это иметь графический интерфейс пользователя в фоновом режиме и, когда он закончится, показывать его в RTB, он закончен или ошибки, которые он выдает.
Только ты можешь можешь подписывать делегат или метод в событие внутри метода или в строителе . Ты не можешь делать это в заявлении класса:
NombreConstructor(){
//Asocio el evento al metodo notificar
Evento += new delegado(notificar); // funciona perfectamente
}
public void notificar(string notificacion){
if (InvokeRequired)
Invoke(new Action(() => BoxText.Text += notificacion + "\n"));
}
полный Код:
NombreConstructor(){
//Asocio el evento al metodo notificar
Evento += new delegado(notificar);
}
//Escribir con un delegado en el richTextBox
//Creo un delegado de la clase
private delegate void delegado(string notificaciones);
//Creo un evento del delegado
private event delegado Evento;
public void notificar(string notificacion){
if (InvokeRequired)
Invoke(new Action(() => BoxText.Text += notificacion + "\n"));
}
//Boton enviar. Empieza la funcion en segundo plano, y al llamar a RunWorker llama a Dowork.
private void enviar_Click(object sender, EventArgs e){
if (backgroundWorker1.IsBusy != true){
//inicia el proceso
backgroundWorker1.RunWorkerAsync();
}
}
, Где NombreConstructor
, - имя строителя класса.