0

クリップボードから画像を受け取り、いくつかの操作を行ってから、ユーザーがそれをアップロードして画像のURLを取得できるようにするユーザーコントロール(winforms)を作成しています。

そのコントロールのユーザーに、アップロードする独自のコードを記述してもらいたい。usercontrolに[アップロード]ボタンがあります。そのボタンをクリックしてユーザーが記述したコードを呼び出し、画像オブジェクトを渡します。

デリゲートを試してみましたが、デリゲートを使用すると、ユーザーはそれを呼び出す必要があります。しかし、私はユーザーがそれを呼び出さないようにしたいのですが、代わりに私のコントロールのアップロードボタンをクリックして呼び出す必要があります。


以下を読みましたが、 C#を使用してメソッドをパラメーターとして渡すのに役立ちませんでし
たメソッド名を別のメソッドに渡し、デリゲート変数を介して呼び出すにはどうすればよいですか?

コントロールが使用されているフォームでユーザーがアップロードメソッドを上書きできるようにして、ユーザーが自分のコードなどを記述できるようにする方法はありますか?誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

0

これを実現するには、主に2つのオプションがあります。コントロールのユーザーに、[アップロード]ボタンがクリックされたときにコントロールによって呼び出されるアップロードメソッドを提供するように要求するか、コントロールをサブクラス化するように要求するか、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...
    }
}
于 2012-12-12T17:55:38.177 に答える