3

アプリケーションに、テキストボックスと2つのボタンを持つユーザーコントロールを作成しました。1つのボタンは、テキストボックスからDBにデータを追加することであり、2番目のボタンはアクションをキャンセルします。次に、このユーザーコントロールは複数のダイアログ(フォーム)に追加されますが、ボタンで同じイベントをトリガーする必要があります。そのため、ボタンをダイアログではなくユーザーコントロールに配置しました。

私がやろうとしているのは、[データの追加]ボタンをクリックして成功した後、コントロールが配置されているダイアログを閉じることです。

編集:

ユーザーコントロールからトリガーされたときにダイアログを閉じるためにこれをコーディングする方法がわかりません。これまでユーザーコントロールを使用したことがないため、どこから始めればよいかわかりません。通常、私はダイアログにコントロールを持っているだけです。DialogResult = DialogResult.OK;

ありがとう

4

6 に答える 6

6

モーダルで開かれたフォームは、DialogResult が設定されると自動的に閉じます。その音から、フォームではなく、コントロールの DialogResult を設定しています。あなたがやろうとしていることを行うには、親フォーム ダイアログの結果の設定を設定またはトリガーするためのコントロールが必要です。これは、次のいずれかで実行できます。

1.フォームの参照をコントロールに渡します。これにより、コントロールはそれを設定できます。

2.フォームがリッスンするコントロールに、閉じるように指示するイベントを作成します。(推奨される方法)

3. (ハックな方法)次のコードを使用して、フォーム ダイアログの結果を設定します。

this.ParentForm.DialogResult = DialogResult.OK;

フォームもモーダルで表示する必要があります。それ以外の場合は、手動で Close() メソッドを呼び出す必要があります。

于 2011-03-16T14:23:21.767 に答える
4

この問題を解決するには、デリゲートを使用する必要があります。

コントロールのコード ビハインドで、メイン フォーム自体を閉じるように指示するために使用するデリゲートを定義します。親フォームを閉じたいコントロール内のどこでも、親フォームによって処理されるこのカスタム イベントを発生させます。例として、コントロールのボタン クリックで親フォームを閉じたいと仮定します。

public delegate void CloseHostFormEventHandler(Object sender, EventArgs e);

public partial class MyControl : Control {

    public event CloseHostFormEventHandler CloseFormEvent;


    public closeButton_Clicked(object sender, EventArgs) {
        // do your db stuff

        // you could create your own class here and pass the object to your main form if you wanted
        EventArgs myargs = new EventArgs(); 

        // tell host form to close itself
        CloseFormEvent(this, myargs);

    }
}

親フォームでは、コントロールによって発生したイベントを処理する必要があります。

public partial class MyForm : Form {

    public MyForm() {

        InitializeComponent();

        // ill assume your control was added via the designer and thus done in InitializeComponent()

        // hook up event handler
        mycontrol.CloseFormEvent += CloseFormEventHandler(closeformCallback);
    }

    protected void closeformCallback(object sender, EventArgs e) {
        DialogResult = DialogResult.OK;
        this.Close();
    }


}
于 2011-03-16T15:18:41.470 に答える
2

あなたが多くの情報を与えていないので、私は大げさな推測をするつもりです。

モーダルダイアログではないため、ダイアログは閉じません。ShowDialog()ではなくで表示してみてくださいShow()

于 2011-03-16T14:22:36.407 に答える
1

ユーザーコントロールのClickイベントハンドラーに次のように配置できます。

        Form f = this.ParentForm;
        if (f != null)
        {
            f.DialogResult = DialogResult.OK;
        }
于 2011-03-16T14:25:21.417 に答える
1

トニーの言うとおりだ。close メソッドを呼び出す必要があります。

できることは、呼び出しへの参照をコントロールに渡し、そこから close メソッドを呼び出すことです。

于 2011-03-16T14:24:41.527 に答える