Пользовательские события в C # - PullRequest
0 голосов
/ 26 октября 2011

Я добился некоторого прогресса в своем последнем вопросе: Обратная передача текста события из многопоточного класса в Windows ActiveForm

Я также добился определенного прогресса в этом: http://www.codeproject.com/KB/cs/simplesteventexample.aspx

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

Вот то, что у меня в настоящее время есть мудрый код.

public class TextArgs : EventArgs
{
    private string CurrentText;

    public string Text
    {
        set
        {
            CurrentText = value;
        }
        get
        {
            return this.CurrentText;
        }
    }
}

class Scan
{
    public event TextHandler Text;
    public delegate void TextHandler(Scan s, TextArgs e);

    private void ProcessDirectory(String targetDirectory, DateTime cs)
    {
        SetScanHistory(targetDirectory);

        // Does a bunch of stuff...
    }

    // EDIT: Forgot this bit of code; thanks for pointing this out :)
    // Sets the text of scan history in the ui
    private void SetScanHistory(string text)
    {
        if (Text != null)
        {
            TextArgs TH = new TextArgs();
            TH.Text = text;
            Text(this, TH);
        }
    }

    // Does more stuff...
}

Моя форма Windows:

public partial class MyWinForm: Form
{
    private void NewScan(Object param)
    {
        Scan doScan = new Scan();
        doScan.StarScan(Convert.ToInt32(checkBoxBulk.Checked));
        doScan.Text += new Scan.TextHandler(SetText);
    }

    // Sets the text of txtScanHistory to the text 
    private void SetText(Scan s, TextArgs e)
    {
        // Invoke is always required (which is intended)
        this.Invoke((MethodInvoker)delegate
        {
            txtScanHistory.Text += e.Text + Environment.NewLine;
        });
    }
}

Опять же, я не вижу никаких ошибок, но текстовое поле не обновляется вообще. Я уверен, что я не пишу что-то, я просто недостаточно осведомлен в теме пользовательских событий, я не уверен, как это исправить.

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Ваш код правильный, за исключением одной крошечной, но очень важной детали. Вы подписываетесь на обработчик событий ПОСЛЕ выполнения кода, который вы ожидаете отслеживать. Измените ваш метод NewScan на вызов StarScan после регистрации обработчика события:

private void NewScan(Object param) 
{ 
    Scan doScan = new Scan(); 
    doScan.Text += new Scan.TextHandler(SetText); 
    doScan.StarScan(Convert.ToInt32(checkBoxBulk.Checked)); 
}
1 голос
/ 26 октября 2011

Вам необходимо подписаться на событие до того, как запустит код:

private void NewScan(Object param)
{
    Scan doScan = new Scan();
    // Change the order so you subscribe first!
    doScan.Text += new Scan.TextHandler(SetText);
    doScan.StarScan(Convert.ToInt32(checkBoxBulk.Checked));
}
...