在页面上使用用户控件两次时,一个用户控件上的事件和委托问题

时间:2012-06-06 09:21:58

标签: c# events user-controls delegates

我已解决用户控制问题。

我在页面上使用了两个地址,一个用于公司地址,另一个用于邮寄地址。 所以我在页面上使用了两次地址用户控件。

在此地址用户控件中,当用户填写邮政编码时,我将从DataBase中提取街道地址和建筑物地址,并为用户填写文本框。

但我的问题是每当用户填写一个邮政编码时,两个地址用户控件都填充了相同的数据。

以下是我的地址用户控制示例代码

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 * &amp; MailAddressForService_APICall ,因此两个地址用户控件都填充了相同的数据。

我该如何处理这种情况? 我想只填充一个相应的地址用户控件。 提前谢谢。

凯文

更新

这是我的代码将填充数据。这是在 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)
        {
            ...
        }
    }

1 个答案:

答案 0 :(得分:1)

从您的问题和您的评论,我知道txtPostalCode是您的UserControl的一部分,并且txtPostalCode_TextChanged也在您的UserControl中定义,而AddressForService和MailAddressForService是在包含2 UserControls(Address1和Address2,I)的表单中定义的假设)。

如果是这种情况,那么您的错误就是您认为txtPostalCode_TextChanged的实现已经知道表单上会有两个控件。您应该简单地用一个事件替换您的事件,如下所示:

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

通过这种方式,你有2个UserControls代表一个地址,Address1和Address2,并且在每个控件中都有一个文本字段(txtPostalCode),当它被改变时,执行txtPostalCode_Changed,它会为你的控件激活PostalCodeChanged。 p>

在InitializeEvents中,您使用两种不同的方法订阅了用户控件的PostalCodeChanged事件。这意味着当更改Address1的txtPostalCode时,仅对Address1控件触发PostalCodeChanged,并且只会执行订阅该事件的方法,而不会执行附加到Address2中相同事件的方法。

如果两个方法(AddressForService和MailAddressForService)仍然执行,则代码中的其他位置必定存在问题。我会尝试调试它,在不应该执行的方法中使用断点更改Address1中的txtPostalCode(MailAddressForService)。然后我会看看调用堆栈,了解你是如何到达那里的,并检查Address1的PostalCodeChanged事件以查看订阅该事件的内容。