0

我有地址用户控制。

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

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

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

这是我的地址用户控件示例代码

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

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

凯文

更新

这是我将填充数据的代码。这是在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 个 UserControl(地址 1 和地址 2,我想)的形式定义。

如果是这种情况,您的错误是您的 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 个代表地址的 UserControl,Address1 和 Address2,并且在这些控件中的每一个中,您都有一个文本字段 (txtPostalCode),该字段在更改时会执行 txtPostalCode_Changed,它会为您的控件触发 PostalCodeChanged。

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

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

于 2012-06-06T10:15:47.330 回答