You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串"matchingMessage"加入List<Item>解决GridView重复显示问题

解决GridView每行显示对应错误信息的问题

你的问题根源很清晰:matchingMessagePublic是一个全局字符串变量,每次循环都会被新的错误信息覆盖,最终所有GridView行都会使用最后一次(或因循环顺序导致的首个)赋值的错误内容。要让每行对应自身邮件的错误,必须把错误信息和每个Item对象绑定在一起。

下面是具体的修改步骤:

1. 创建自定义的EmailItem类

首先,我们需要一个继承自Exchange Item的自定义类,用来存储每个邮件专属的错误信息:

public class EmailItem : Item
{
    // 新增属性,用于存储当前邮件匹配到的错误信息
    public string MatchingMessage { get; set; }
}

2. 修改邮件处理类中的集合类型

把你的EmailList从List<Item>改成List<EmailItem>,这样就能存储每个邮件的专属错误信息了:

// 替换原来的List<Item> EmailList = new List<Item>();
public List<EmailItem> EmailList = new List<EmailItem>();

3. 更新邮件处理逻辑,绑定错误信息到每个EmailItem

修改DisplayErrorEmails方法中的循环逻辑,创建EmailItem实例并将错误信息赋值给它:

private bool DisplayErrorEmails(ExchangeService service) {
    try {
        FindItemsResults<Item> findResults;
        DateTime TwoDays = DateTime.Today.AddDays(-2);
        // 省略原有的搜索过滤器代码...

        ItemView view = new ItemView(100);
        do {
            findResults = service.FindItems(WellKnownFolderName.Inbox, compoundFilter, view);
            // 提前加载所有需要的属性,避免循环内重复请求,提升性能
            PropertySet GetItemsPropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
            GetItemsPropertySet.RequestedBodyType = BodyType.Text;
            service.LoadPropertiesForItems(findResults.Items, GetItemsPropertySet);

            foreach (Item originalItem in findResults.Items) {
                // 创建自定义EmailItem实例,复制原Item的核心属性
                EmailItem emailItem = new EmailItem(service) {
                    Id = originalItem.Id,
                    Subject = originalItem.Subject,
                    DisplayTo = originalItem.DisplayTo,
                    DateTimeCreated = originalItem.DateTimeCreated,
                    Body = originalItem.Body
                };

                string EmailBody = originalItem.Body.Text;
                var pattern = new[] {
                    "Remote Server returned '554 5.4.4 SMTPSEND.DNS.NonExistentDomain; nonexistent domain",
                    "Either there are no alternate hosts, or delivery failed to all alternate hosts",
                    "Remote Server returned '550 No Such User Here",
                    "5.2.3 smtp;550 5.2.3 RESOLVER.RST.SendSizeLimit.Org; message too large for this organization",
                    "5.1.10 smtp;550 5.1.10 RESOLVER.ADR.RecipientNotFound; Recipient user@contoso.com not found by SMTP address lookup",
                    "Remote Server returned '550 4.4.7 QUEUE.Expired; message expired'",
                    "Remote host said: 550-5.1.1 The email account that you tried to reach does not exist",
                };
                string matchingMessage = String.Empty;
                var found = pattern.Any(m => {
                    var match = EmailBody.Contains(m);
                    if (match) matchingMessage = m;
                    return match;
                });
                // 将当前邮件的错误信息绑定到对应的EmailItem
                emailItem.MatchingMessage = matchingMessage;

                Console.WriteLine("Subject" + emailItem.Subject);
                Console.WriteLine("Error::::" + emailItem.MatchingMessage);
                // 添加到自定义集合中
                EmailList.Add(emailItem);
            }

            if (findResults.NextPageOffset != null) {
                view.Offset = (int)findResults.NextPageOffset;
            }
        } while (findResults.MoreAvailable);
        Status = "list of undelivered email.";
        return true;
    } catch (Exception ex) {
        Status = "Error: " + ex.Message;
        return false;
    }
}

这里顺便优化了属性加载逻辑——原来你在循环内重复调用service.LoadPropertiesForItems,现在把它提到外层循环,避免不必要的重复请求,提升程序性能。

4. 修改GridView绑定逻辑,读取每个EmailItem的错误信息

最后,更新LoadResult方法,从每个EmailItem中读取对应的错误信息:

public void LoadResult() {
    EmailMethods email = new EmailMethods();
    email.EmailServer = "https://SampleExchange.asmx";
    email.AccountName = ConfigurationManager.AppSettings["Account"];
    email.Password = ConfigurationManager.AppSettings["Secret"];
    email.Domain = ConfigurationManager.AppSettings["Domain"];
    email.GetEmails();
    DataTable dt = new DataTable();
    dt.Columns.Add("Subject", typeof(string));
    dt.Columns.Add("Sender", typeof(string));
    dt.Columns.Add("DateCreated", typeof(string));
    dt.Columns.Add("EmailHeader", typeof(string));
    dt.Columns.Add("ErrorTwo", typeof(string));
    foreach (EmailItem item in email.EmailList) {
        // 读取当前item的专属错误信息,替代全局的matchingMessagePublic
        dt.Rows.Add(item.Subject, item.DisplayTo, item.DateTimeCreated, item.Body, item.MatchingMessage);
    }
    GridView1.DataSource = dt;
    GridView1.DataBind();
}

这样修改后,每个GridView行都会显示对应邮件的错误信息,不会再出现所有行共用同一个错误内容的问题了。

内容的提问来源于stack exchange,提问作者Robert John Sustraido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:24:32