带有BindingList <outlook.mailitem>的DataGridView不起作用</outlook.mailitem>

时间:2012-12-24 02:43:39

标签: c# winforms outlook vsto

我正在尝试将绑定列表绑定到datagrid,并将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类。

3 个答案:

答案 0 :(得分:1)

替换

BindingList<MailItem> mailItems

MailItem[] mailItems

即将列表转换为数组 然后再试一次

答案 1 :(得分: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();
    }
  }
}

来源:An Introduction to Programming Outlook 2003 Using C#

答案 2 :(得分:0)

也许是你设置的DataGridView属性。尝试删除表单上的DataGridView并拖放一个新的,只设置其名称属性。然后尝试这个有效的代码:

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邮件项。