0

ウィンドウを開くときに、ビジネス オブジェクトに Deleted-event-handler を登録します。次のようにコンストラクタに渡されbusinessます。

business.Deleted += new EventHandler<EventArgs>(business_Deleted);

これで、ユーザーはボタンをクリックして削除できます (レコードの削除です)。イベント ハンドラーは、他のエディター ウィンドウによる削除をキャプチャし、ユーザーに通知するために登録されます (「アイテムは別のエディター ウィンドウで削除されました。」)。

ユーザーが現在のウィンドウでそれを削除すると、このメッセージはばかげているので、前にイベントの登録を解除したいと思います:

Business business = (Business)businessBindingSource.DataSource;
business.Deleted -= new EventHandler<EventArgs>(business_Deleted);

私の問題は単純です。とにかくメッセージが表示されるため、登録解除が機能しません。EventHandler を別のメンバーに格納しようとしました。どちらも機能しません。

どんな助けでもいいです。

マティアス

PSこの投稿を読んで、イベントの登録を適切に解除すると、すべてのエディター ウィンドウで登録が解除されるのではないかと心配しています。次の問題かもしれません。;-)

4

5 に答える 5

1

サンプルコードが期待どおりに機能しない理由はわかりませんが、プライベートメンバー変数を追加して、このユーザーがレコードまたは別のユーザーを削除しているかどうかを確認できます。

private bool otherUser = true;

void business_Deleted(object sender, EventArgs e)
{
    if(otherUser) {
        /* Show message */
    }
}

void deleteButton_Activate(object sender, EventArgs e)
{
    otherUser = false;
    /* Delete record */
}
于 2008-11-24T18:43:45.760 に答える
1

イベントが複数回登録されていませんか? の後にブレークポイントを置きます

business.Deleted -= new EventHandler(business_Deleted);
そして、business.Deleted の _invocationCount と _invocationList (Base -> Non-Public members の下) をチェックして、これ以上イベントが登録されていないことを確認します。

于 2009-06-30T04:05:19.727 に答える
1

この動作が本当に必要な場合 (これは良いパターンだとは思いませんが、問題ではありません)、EventArgs クラスから派生させて、削除の作成者のプロパティを追加できます。次に、次のことができます。

c.Delete( this ); //this = window
// ...
void business_Deleted(object sender, EventArgs e) {
    bool isDeletedFromMe = false;
    if ( e is DeletedEventArgs ) { isDeletedFromMe = object.ReferenceEquals( this, e.Author ); }
    if ( false == isDeletedFromMe ) {
        MessageBox.Show("Item has been deleted in another editor window.",
            "...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        Close();
    }
}

または、次の方法で実行できます。

void business_Deleted(object sender, EventArgs e)
{
    if ( false == object.ReferenceEquals( sender, this.currentlyDeletingBusiness ) ) {
        MessageBox.Show("Item has been deleted in another editor window.",
            "...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    Close();
}

Business currentlyDeletingBusiness;
private void deleteButton_Activate(object sender, EventArgs e)
{
    Business c = (Business)businessBindingSource.DataSource;
    try {
        this.currentlyDeletingBusiness = c;
        c.Delete();
    }
    finally {
        this.currentlyDeletingBusiness = null;
    }
}
于 2008-11-20T08:51:16.830 に答える
0

私が見る数行から、これが問題である可能性があります:

Business business = (Business)businessBindingSource.DataSource;

ビジネスが保持する参照を別のオブジェクトに変更しているようです。おそらくあなたのものは単なる例であり、毎回同じオブジェクトを使用しています.

于 2008-11-20T08:13:26.690 に答える
0

もちろん、可能な限り短い完全なサンプルは次のとおりです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication
{
    public partial class BusinessEditor : Form
    {
        private EventHandler<EventArgs> businessDeletedHandler;

        public BusinessEditor(Business business)
            : this()
        {
            InitializeComponent();

            businessBindingSource.DataSource = business;

            // Registering
            businessDeletedHandler = new EventHandler<EventArgs>(business_Deleted);
            business.Deleted += businessDeletedHandler;
        }

        void business_Deleted(object sender, EventArgs e)
        {
            MessageBox.Show("Item has been deleted in another editor window.",
                "...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            Close();
        }

        private void deleteButton_Activate(object sender, EventArgs e)
        {
            Business c = (Business)businessBindingSource.DataSource;
            // Unregistering
            c.Deleted -= businessDeletedHandler;
            c.Delete();
            Close();
        }
    }
}

同じ例だと思います、エド。私はこれで正しいですか?

ご挨拶、そしてありがとう!

于 2008-11-20T08:31:35.217 に答える