0

アドレス ユーザー コントロールがあります。

私のページでは、会社の住所と郵送先住所の 2 つの住所を使用しています。そのため、アドレス ユーザー コントロールを 1 ページで 2 回使用します。

この住所ユーザー コントロールでは、ユーザーが郵便番号を入力すると、DataBase から住所と建物の住所を取得し、ユーザーのテキスト ボックスに入力します。

しかし、私の問題は、ユーザーが 1 つの郵便番号を入力するたびに、両方のアドレス ユーザー コントロールに同じデータが入力されることです。

アドレス ユーザー コントロールのサンプル コードを次に示します。

public delegate void AddressForServiceHandler(string callType, string refreshType, Dictionary<string, string> keyvalues);
public delegate void MailAddressForServiceHandler(string callType, string  refreshType, Dictionary<string, string> keyvalues);
public event AddressForServiceHandler AddressForService_APICall;
public event MailAddressForServiceHandler MailAddressForService_APICall;


protected void txtPostalCode_TextChanged(object sender, EventArgs e)
    {
            #region delegate func
            Dictionary<string, string> Params = new Dictionary<string, string>();
            Params.Add("PostalCode", txtPostalCode.Text.Trim());

            if (AddressForService_APICall != null)
            {
                AddressForService_APICall(txtPostalCode.Text, "PostalCode", Params);
            }
            if (MailAddressForService_APICall != null)
            {
                MailAddressForService_APICall(txtPostalCode.Text, "PostalCode", Params);
            }
            #endregion

    }

txtPostalCode_TextChangedイベントは*AddressForService_APICall*MailAddressForService_APICallの両方を発生させるため、両方の Address ユーザー コントロールに同じデータが入力されます。

この状況をどのように処理すればよいですか? 対応する Address ユーザー コントロールを 1 つだけ設定したい。前もって感謝します。

ケビン

アップデート

データを埋める私のコードは次のとおりです。これはaspxページのコーディングです。

protected void InitializeEvents()
    {
        Address1.AddressForService_APICall += new AddressForServiceHandler(AddressForService);
        Address2.MailAddressForService_APICall += new MailAddressForServiceHandler(MailAddressForService);
    }


protected void AddressForService(string callType, string refreshType, Dictionary<string, string> keyvalues)
    {
        try
        {
            using (ServiceAddress cmProxy = new ServiceAddress())
            {
                Dictionary<string, string> dsPostalCode = new Dictionary<string, string>;
                dsPostalCode = cmProxy.GetAddress(callType, refreshType, keyvalues);// it will return the dictionary filled with the data
                Address1.RefreshAddressForRegistration(dsPostalCode); // here I call address control method to fill the data
            }
        }
        catch (Exception ex)
        {
            ...
        }
    }

    protected void MailAddressForService(string callType, string refreshType, Dictionary<string, string> keyvalues)
    {
        try
        {
            using (ServiceAddress cmProxy = new ServiceAddress())
            {
                Dictionary<string, string> dsPostalCode = new Dictionary<string, string>;
                dsPostalCode = cmProxy.GetAddress(callType, refreshType, keyvalues);
                Address2.RefreshAddressForRegistration(dsPostalCode);
            }
        }
        catch (Exception ex)
        {
            ...
        }
    }
4

1 に答える 1

1

あなたの質問とコメントから、txtPostalCode は UserControl の一部であり、txtPostalCode_TextChanged も UserControl で定義されていることを理解していますが、AddressForService と MailAddressForService は 2 つの UserControls (Address1 と Address2 だと思います) を含むフォームで定義されています。

この場合、エラーは、txtPostalCode_TextChanged の実装が、フォームに 2 つのコントロールがあることを既に知っているかのように考えられているという事実です。次のように、イベントを 1 つのイベントに単純に置き換える必要があります。

public delegate void AddressForServiceHandler(string callType, string refreshType, Dictionary<string, string> keyvalues);

public event AddressForServiceHandler PostalCodeChanged;

protected void txtPostalCode_TextChanged(object sender, EventArgs e)
    {
            Dictionary<string, string> Params = new Dictionary<string, string>();
            Params.Add("PostalCode", txtPostalCode.Text.Trim());

            if (PostalCodeChanged != null)
            {
                PostalCodeChanged(txtPostalCode.Text, "PostalCode", Params);
            }
    }

次に、UserControls を使用するフォームでは、コードは次のようになります。

protected void InitializeEvents()
    {
        Address1.PostalCodeChanged += new AddressForServiceHandler(AddressForService);
        Address2.PostalCodeChanged += new AddressForServiceHandler(MailAddressForService);
    }

このようにして、住所 Address1 と Address2 を表す 2 つの UserControls があり、これらの各コントロールにはテキスト フィールド (txtPostalCode) があり、変更されると、txtPostalCode_Changed を実行し、コントロールの PostalCodeChanged を起動します。

InitializeEvents では、2 つの異なるメソッドを使用して、ユーザー コントロールの PostalCodeChanged イベントをサブスクライブします。これは、Address1 の txtPostalCode が変更されると、PostalCodeChanged が Address1 コントロールに対してのみ発生し、そのイベントにサブスクライブされたメソッドのみが実行され、Address2 の同じイベントに関連付けられたメソッドは実行されないことを意味します。

両方のメソッド (AddressForService と MailAddressForService) がまだ実行されている場合は、コードのどこかに問題があるはずです。Address1 の txtPostalCode を、実行されるべきではないメソッド (MailAddressForService) のブレークポイントで変更して、デバッグを試みます。次に、コール スタックを調べてどのようにしてそこに到達したかを理解し、Address1 の PostalCodeChanged イベントを調べて、そのイベントにサブスクライブされているものを確認します。

于 2012-06-06T10:15:47.330 に答える