从usercontrol中的按钮单击调用用户编写的代码/方法

时间:2012-12-12 17:40:59

标签: c# user-controls delegates

我正在编写一个usercontrol(winforms),它接受剪贴板中的图像,进行一些操作,然后允许用户上传它并获取图像的URL。

我希望该控件的用户编写他/她自己的代码进行上传。我在usercontrol中有一个上传按钮,我想在点击该按钮时调用用户编写的代码并传递图像对象。

我已经尝试过代理但是使用委托,用户必须调用它。 但我希望用户不应该调用它,而应该在我的控件中单击上传按钮时调用它。

我已阅读以下内容,但他们没有帮助 Pass Method as Parameter using C#
How can I pass a method name to another method and call it via a delegate variable?

有什么方法可以让我们允许用户在使用控件的表单中覆盖上传方法,这样他可以编写自己的代码或其他东西吗? 有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

实现此目的有两个主要选项,要么通过要求控件的用户提供控件在单击“上载”按钮时调用的上载方法,要么可以要求控件是子类,并实施了Upload方法。

方法1 - 提供在上传时调用的代理:

public partial class MyControl
{
    // Define a delegate that specifies the parameters that will be passed to the user-provided Upload method
    public delegate void DoUploadDelegate(... parameters ...);

    private readonly DoUploadDelegate _uploadDelegate;

    public MyControl(DoUploadDelegate uploadDelegate)
    {
        if (uploadDelegate == null)
        {
            throw new ArgumentException("Upload delegate must not be null", "uploadDelegate");
        }
        _uploadDelegate = uploadDelegate;
        InitializeComponent();
    }

    // ...

    // Upload button Click event handler
    public void UploadButtonClicked(object sender, EventArgs e)
    {
        // Call the user-provided upload handler delegate with the appropriate arguments
        _uploadDelegate(...);
    }
}

方法2 - 要求覆盖上传方法:

public abstract partial class MyControl
{
    private readonly DoUploadDelegate _uploadDelegate;

    protected MyControl()
    {
        InitializeComponent();
    }

    // ...

    // The method that users of the control will need to implement
    protected abstract void DoUpload(... parameters ...);

    // Upload button Click event handler
    public void UploadButtonClicked(object sender, EventArgs e)
    {
        // Call the overridden upload handler with the appropriate arguments
        DoUpload(...);
    }
}

对于后一种选择,用户需要先对控件进行子类化才能使用它,如下所示:

public class MyConcreteControl : MyControl
{
    protected override void DoUpload(... parameters ...)
    {
        // User implements their own upload logic here...
    }
}