2010-09-10 73 views
1

所以我有一个列表框,显示电子邮件的主题(我使用chilkat imap客户端)当我选择电子邮件的主题我想显示邮件正文在一个文本框,但我无法弄清楚如何做到这一点,obviusly我使用列表框selectindexchanaged事件,但如何将我去一下从列表框中显示电子邮件正文在文本框Imap/pop3

到目前为止的代码

// Create an object, connect to the IMAP server, login, 
     // and select a mailbox. 
     Chilkat.Imap imap = new Chilkat.Imap(); 
     imap.UnlockComponent("UnlockCode"); 
     imap.Connect("Imap URL"); 
     imap.Login("email address", "password"); 
     imap.SelectMailbox("Inbox"); 

     // Get a message set containing all the message IDs 
     // in the selected mailbox. 
     Chilkat.MessageSet msgSet; 
     msgSet = imap.Search("ALL", true); 

     // Fetch all the mail into a bundle object. 
     Chilkat.EmailBundle bundle = new Chilkat.EmailBundle(); 
     bundle = imap.FetchBundle(msgSet); 

     // Loop over the bundle and display the From and Subject. 
     Chilkat.Email email; 
     int i; 
     for (i = 0; i < bundle.MessageCount - 1; i++) 
     { 

      email = bundle.GetEmail(i); 
      listBox1.Items.Add(email.From + ": " + email.Subject); 
      textBox1.Text = email.Body ; 

     } 

     // Save the email to an XML file 
     bundle.SaveXml("bundle.xml"); 



     // Disconnect from the IMAP server. 
     // This example leaves the email on the IMAP server. 
     imap.Disconnect(); 
    } 
} 

在此先感谢

+0

仍然不能得到任何其他想法的任何其他想法做任何我想要的 – Shane121 2010-09-10 17:59:49

回答

2

假设电子邮件指标保持不变(我认为最安全的方式,以确保那是缓存的形式取出包),我会改变对使用ListView代替ListBox,然后我'd将索引添加到列表中,作为单独的列或在项目的Tag中。

你设置完的ListView看,因为你需要它来寻找(ListView.View = View.Details;ListView.MultiSelect = false;很可能是主要的),而不是:

listBox1.Items.Add(email.From + ": " + email.Subject); 

如果你这样做,你可以这样做(在Tag方式,这是稍微容易,但有些人认为是坏的):

listView1.Items.Add(email.From + ": " + email.Subject).Tag = i; 

然后当用户在列表中选择一个主题,就像你说的,你处理ListView.SelectedIndexChanged事件,然后就一切都做得那么omething像:

if(ListView.SelectedItems.Count > 0) 
{ 
    textBox1.Text = bundle.GetEmail((int)ListView.SelectedItems[0].Tag).Body; 
} 

或者,如果你确定你永远只想要得到来自电子邮件的文本,可以插入文本到标签,而不是指标。

+0

没有抱歉不能得到它的工作 – Shane121 2010-09-12 12:11:02

+0

你可以解释它更容易一点即时新的C#所以我没有得到你说的感谢帮助,虽然 – Shane121 2010-09-12 12:17:46

+0

@Shane:你是否已经从你的表单中的'ListBox'变成了'ListView'?并命名为'ListView' listView1?然后改变了'View'和'MultiSelect'属性,正如我在上面的回答中所描述的那样?之后,你必须在'ListView'中添加一个'Column'(你可以通过它的'Columns'属性来完成这项工作,然后希望剩下的代码变得合理。 – 2010-09-12 14:33:22

1

在XAML中集将列表框绑定到你想要的属性上,并为w设置事件处理程序当选择改变时。

<StackPanel> 
     <ListBox Name="listbox1" SelectionChanged="listbox_SelectionChanged"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Path=From}" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <ListBox Name="listbox2" SelectionChanged="listbox_SelectionChanged"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Path=Subject}" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <TextBox Name="textbox1"></TextBox> 
    </StackPanel> 

然后在你的代码后面。将列表框绑定到电子邮件对象列表。

 listbox1.ItemsSource = emails; 
     listbox2.ItemsSource = emails; 

最后你需要处理列表框中的事件。

private void listbox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     ListBox listbox = (ListBox)sender; 
     foreach (Email email in listbox.SelectedItems) 
     { 
      textbox1.Text = email.Body; 
     } 
    } 

请注意此代码未经测试。

+0

抱歉无法让它工作ñ其他想法 – Shane121 2010-09-12 12:21:26

+0

它在哪种方式不起作用?它是否抛出异常?如果是这样,这个消息是什么? – eoldre 2010-09-16 16:00:58

1

您的问题不在电子邮件中,而与您在表单中显示项目的方式有关。你正在尝试以winforms的方式来做事,这对winforms(类)来说很好,但是在WPF中确实没有意义且代码繁多。您应该阅读关于MVVM的一些内容(关于这个主题的大量问题)。

下面是一个演示,演示了如何使用仅使用WPF绑定基础结构的几行代码。您可以创建一个新的WPF应用程序,并复制几行代码(更改我的名称空间和类名以匹配您创建的应用程序!),并在实际中看到它。

有一个窗口。我在这里模拟电子邮件;你会得到你的电子邮件,并在收集转储他们:

public partial class MainWindow : Window 
{ 
    public ObservableCollection<FakeEmail> Emails { get; private set; } 

    public MainWindow() 
    { 
     Emails = new ObservableCollection<FakeEmail>(); 
     // simulates emails being received; you would popoulate with valid emails IRL 
     Emails.Add(new FakeEmail 
      { From = "herp", Subject = "derp", Message = "herp derp" }); 
     Emails.Add(new FakeEmail 
      { From = "foo", Subject = "bar", Message = "foo bar" }); 
     Emails.Add(new FakeEmail 
      { From = "Binding", Subject = "Rocks", Message = "Binding rocks" }); 
     InitializeComponent(); 
    } 
} 
/// <summary> 
/// I don't have your libraries 
/// </summary> 
public sealed class FakeEmail 
{ 
    public string From { get; set; } 
    public string Subject { get; set; } 
    public string Message { get; set; } 
} 

我添加类型FakeEmail的一个ObservableCollection的窗口。 OC与绑定一起工作良好,因为集合在元素添加或删除时通知绑定。

接下来,窗口。请注意,我没有在这里显示<Window的定义,但我已将窗口命名为emailClient

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <ListBox 
     x:Name="emailList" 
     ItemsSource="{Binding Emails, ElementName=emailClient}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock 
         Text="{Binding From}" /> 
        <TextBlock 
         Text="{Binding Subject}" 
         TextWrapping="NoWrap" 
         TextTrimming="CharacterEllipsis" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
    <TextBlock 
     Grid.Column="1" 
     Text="{Binding SelectedValue.Message, ElementName=emailList, FallbackValue='Select an email pls'}" /> 
</Grid> 

一些更精细的音符:ListBox的的ItemsSource必然会我的窗口中定义的的ObservableCollection。 ListBox将侦听该集合中进出的项目,并使用DataTemplate为集合中的每个项目显示UI。

对于每个FakeEmail ItemTemplate中找到,它会创建的DataTemplate和内容的新实例,并设置模板的FakeEmail实例的的DataContext。这意味着,在DataTemplate中,我可以简单地绑定FakeEmail实例的属性,并在运行时将所有内容连接起来。

ListBox有一个属性,名为SelectedValue,我可以用它来显示电子邮件消息。当您在ListBox中选择一个项目时,SelectedValue是来自ItemsSource的实例,它是DataTemplate的DataContext;目前在用户界面中显示该项目的内容。因此,为了显示当前选择的电子邮件消息,我只需要绑定到ItemSource的SelectedValue的消息属性,因为SelectedValue将是当前选定的电子邮件。

就是这样。不听,不是“\ r \ n”BS。一对夫妇绑定和一个Observable集合。

相关问题