質問

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

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

編集:

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

ありがとう

役に立ちましたか?

解決

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

1. フォームの参照を通過してコントロールに渡すと、コントロールが設定されます。

2. フォームが耳を傾けるコントロールでイベントを作成し、閉じることを指示します。 (推測された方法)

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

this.ParentForm.DialogResult = DialogResult.OK;

フォームもモダンに表示する必要があります。そうしないと、手動でclose()メソッドを呼び出す必要があります。

他のヒント

この問題を解決するために代表者を使用したいと思うでしょう。

コントロールの背後にあるコードで、メインフォームに自分自身を閉じるように指示するために使用する代表者を定義します。あなたのコントロールのどこでも、親フォームを閉じたいと思うなら、親フォームによって処理されるこのカスタムイベントを提起します。たとえば、コントロールのボタンクリックで親フォームを閉じたいと思います

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();
    }


}

あなたは多くの情報を提供していないので、私はワイルドな推測をするつもりです。

モーダルダイアログではないため、ダイアログは閉じません。一緒に見せてみてください ShowDialog() それよりも Show().

トニーが言うように。閉じる方法を呼び出す必要があります。

あなたができることは、あなたのコントロールへの呼び出しへの参照を渡し、そこからその密接な方法を呼び出すことです。

ユーザーにクリックイベントハンドラーを入れることができます。

        Form f = this.ParentForm;
        if (f != null)
        {
            f.DialogResult = DialogResult.OK;
        }

dialogresultはaを閉じません 非モーダル 形。

フォームまたはこの場合には、フォームの緊密な方法を呼び出す必要があります。

編集

または、show()の代わりにshowdialog()を使用します。

もう一度編集します

によると Dialogresultドキュメント:

フォームがモーダルダイアログボックスとして表示されると、閉じるボタン(フォームの最前線の角にxが付いたボタン)をクリックすると、フォームが非表示になり、dialogresultプロパティがdialogresult.cancelに設定されます。ユーザーがダイアログボックスの閉じるボタンをクリックしたり、DialogResultプロパティの値を設定したりすると、Closeメソッドは自動的に呼び出されません。代わりに、フォームが非表示になり、ダイアログボックスの新しいインスタンスを作成せずに再度表示できます。この動作のため、フォームがアプリケーションで必要とされなくなった場合、フォームの廃棄方法を呼び出す必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top