在C#中将多个事件处理程序连接到一个事件的最佳方法?

时间:2014-10-06 07:11:26

标签: c# .net events handlers

我正在编写一个简单的加密程序。 当我输入第一个文本框时,加密文本会使用textchanged事件动态显示在第二个文本框中。 我还有一个加载密钥文件的按钮。 我的问题是,如果我首先输入文本框,然后加载一个密钥文件,之后不调用加密处理程序,因为它挂钩到textchanged事件,我必须写一些东西到第一个文本框来调用它。

为了解决这个问题,我将2个事件连接到加载按钮的click事件,一个是加载密钥文件,另一个是挂钩到textchanged事件的事件。 (我真的想避免代码重复。)

这是正常的,但我怎么能确定每次加密密钥文件并在加密函数被调用之前完成? 有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您应该考虑创建单独的方法:

private List<string> keyCodes;

private void LoadKeyCodesButton_Click(object sender, RoutedEventArgs e)
{
    LoadKeyCodes();
    UpdateOutput();
}

private void InputTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    UpdateOutput();
}

private void LoadKeyCodes()
{
    // load key codes here
    keyCodes = new List<string>();
    // etc.
}

private void UpdateOutput()
{
    OutputTextBox.Text = EncryptText(InputTextBox.Text);
}

private string EncryptText(string input)
{
    // use keyCodes to encrypt
    return input;
}

加密甚至可以放在一个单独的类中,但这可以帮助你开始。

答案 1 :(得分:1)

看起来你正试图将你的事件链接起来。可以通过从KeyFilesLoadedEvent(或其他任何名称)调用TextChanged事件来完成它。

public event TextChangedEventHandler TextChangedEvent;
public event KeyFilesLoadedEventHandler KeyFilesLoadedEvent;

KeyFilesLoadedEvent += (sender, e) =>
{
    /* the rest of your code for the KeyLoadedEvent  */
    TextChangedEventHandler handler = TextChangedEvent;
    if(handler != null)
    {
        handler(this, e);
    }
};