1

我正在尝试将绑定列表绑定到数据网格,并将 autogeneratecolumns 设置为 true。但是没有显示任何列,我想知道为什么。

代码片段:

datagridResults.AutoGenerateColumns = true;
List<MailItem> mailItems = new List<MailItem>();

//readPst() returns a List<MailItem> populated with MailItems from the specified PST.
mailItems = readPst(txtBoxPST.Text, "Archive Folders");
BindingList<MailItem> bl = new BindingList<MailItem>(mailItems);

datagridResults.DataSource = bl;
datagridResults.Refresh();

数据网格最终为空白。我确信 BindingList 包含 MailItems,如果我将其从 BindingList 的绑定更改为 bl 中的 Foreach MailItem m ...手动添加行它工作正常。所以我最好的猜测是 AutoGenerateColumns 不适用于 MailItem 类?我不知道为什么,或者解决它的最佳方法。

MailItem 类是 Microsoft.Office.Interop.Outlook.MailItem 类。

4

3 回答 3

1

代替

BindingList<MailItem> mailItems

MailItem[] mailItems

即将列表转换为数组并重试

于 2012-12-24T05:06:45.960 回答
0

只需添加ToList(),不需要刷新DataGridView

datagridResults.DataSource = bl.Tolist();

更新

MailItems这是如何阅读OutLook

public static void DisplayInbox(ApplicationClass o)
{
  // Get items in my inbox. 
  NameSpace outlookNS = o.GetNamespace("MAPI");
  MAPIFolder inboxFolder 
    = outlookNS.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
  // Print out some basic info. 
  Console.WriteLine("You have {0} e-mails.", 
    inboxFolder.Items.Count);
  Console.WriteLine();
  foreach(object obj in inboxFolder.Items)
  {
    MailItem item = obj as MailItem;
    if(item != null)
    {
      Console.WriteLine("-> Received: {0}", 
        item.ReceivedTime.ToString());
      Console.WriteLine("-> Sender: {0}", item.SenderName);
      Console.WriteLine("-> Subject: {0}", item.Subject);
      Console.WriteLine();
    }
  }
}

资料来源:使用 C# 编程 Outlook 2003 简介

于 2012-12-24T02:47:27.900 回答
0

也许它是您设置的 DataGridView 属性。尝试删除 Form 上的 DataGridView 并拖放一个新的,只设置它的 name 属性。然后试试这个有效的代码:

public class MailItems
{
    public string name { get; set; }
    public string address { get; set; }
}

List<MailItems> items = new List<MailItems>();
public Form1()
{
    InitializeComponent();
    items.Add(new MailItems(){address = "1 Some St",name = "Kiklion"});
}

private void button1_Click(object sender, EventArgs e)
{
    datagridResults.AutoGenerateColumns = true;
    BindingList<MailItems> gridItems = new BindingList<MailItems>(items);
    dataGridView1.DataSource = gridItems;
}

您的代码应该可以工作:

datagridResults.AutoGenerateColumns = true;
BindingList<MailItem> mailItems =  new BindingList<MailItems>(readPst(txtBoxPST.Text, "Archive Folders"));
datagridResults.DataSource = mailItems;

编辑

它不能在 Microsoft.Office.Interop.Outlook.MailItem 类上使用 BindingList。我建议您不要将 DataGridView.Datasource 直接绑定到 Outlook Interop 类,正如我所展示的那样抽象该类,并使用自定义代码更新 Outlook 邮件项。

于 2012-12-24T02:52:04.060 回答