2010-09-10 143 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集合。

相關問題