2012-12-24 39 views
1

我想绑定一个绑定列表到一个数据网格,并将autogeneratecolumns设置为true。然而,没有列显示,我想知道为什么。DataGridView与BindingList <Outlook.MailItem>不起作用

代码片段:

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类。

回答

0

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

datagridResults.DataSource = bl.Tolist();

更新

这是如何阅读MailItemsOutLook

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#

+0

好猜测,但'不需要ToList',它的工作原理没有它。 –

+0

我试过了,它不起作用。我不认为我需要刷新,谢谢澄清。 –

+0

@Jeremy Thompson,它的真实:)。到Kiklion,我更新了我的答案。我希望它能帮助你。 – spajce

0

也许它的一个DataGridView属性你设置。尝试删除窗体上的DataGridView,并拖放一个新窗体并仅设置其名称Property。那就试试这个代码的工作原理:

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

+0

我将编辑第一个问题,但确实有效,但我没有使用自己的MailItems类,而是使用了Microsoft.Office.Interop.Outlook.MailItem类。尝试使用新的datagridview,而不更改任何选项也无法正常工作。 –

1

更换

BindingList<MailItem> mailItems 

MailItem[] mailItems 

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

相关问题