如何将字符串"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
相关产品推荐
相关产品推荐

