2011-10-18 19 views
8

मैं डब्ल्यूपीएफ के साथ काम कर रहा हूं और मैं ड्रैग'ड्रॉप टेक्स्टबॉक्स बनाने की कोशिश कर रहा हूं।
इस टेक्स्टबॉक्स में मैं एक ईमेल का बॉडी प्राप्त करना चाहता हूं जिसे मैं दृष्टिकोण से खींचता हूं।
कोड काम करता है लेकिन मुझे लगता है कि मुझे ActiveExplorer कारण को "रीसेट" करने के लिए कुछ चाहिए, अब यह केवल अंतिम "नया" ईमेल दिखाता है जिसे मैं टेक्स्टबॉक्स में खींचता हूं।आउटलुक ईमेल से निकालें [ड्रैग'ड्रॉप]

उदाहरण:

खींचें ईमेल 1 -> पाठ बॉक्स - दिखाता है कि ईमेल 1

खींचें ईमेल 2 -> पाठ बॉक्स - दिखाता है कि ईमेल 2

खींचें ईमेल 1 -> पाठ बॉक्स - शो ईमेल 2 और ईमेल 1 प्रदर्शित नहीं होंगे क्योंकि यह पहले से ही ActiveExplorer में मौजूद है और यह ईमेल 2 दिखाएगा।


आशा है कि मेरा प्रश्न आपके लिए थोड़ा स्पष्ट है ..
अग्रिम धन्यवाद!

XAML कोड:

<TextBox 
    Name="myTextbox" 
    AllowDrop="True" 
    PreviewDragEnter="email_DragEnter" 
    PreviewDrop="email_Drop" /> 

XAML के पीछे कोड:

private void email_DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
    } 

    private void email_Drop(object sender, DragEventArgs e) 
    { 
     Outlook.ApplicationClass oApp = new Outlook.ApplicationClass(); 
     Outlook.Explorer oExplorer = oApp.ActiveExplorer(); 
     Outlook.Selection oSelection = oExplorer.Selection; 

     foreach (object item in oSelection) 
     { 
      Outlook.MailItem mi = (Outlook.MailItem)item; 
      myTextbox.Text = mi.Body.ToString(); 
     } 
    } 

उत्तर

9

मैंने नीचे दिए गए ड्रैगड्रॉप ईवेंट से oApp की घोषणा को स्थानांतरित कर दिया, और यह अपेक्षा के अनुसार काम करता है।

void Startup() 
{ 
    _Outlook = new Outlook.Application(); 
} 

Outlook.Application _Outlook = null; 

private void Form1_DragEnter(object sender, DragEventArgs e) 
{ 
    e.Effect = DragDropEffects.Copy; 
} 

private void Form1_DragDrop(object sender, DragEventArgs e) 
{ 
    richTextBox1.Text = ""; 
    Outlook.Explorer oExplorer = _Outlook.ActiveExplorer(); 
    Outlook.Selection oSelection = oExplorer.Selection; 

    foreach (object item in oSelection) 
    { 
     Outlook.MailItem mi = (Outlook.MailItem)item; 
     richTextBox1.AppendText(mi.Body.ToString() + "\n----------------------------------------\n"); 
    } 
} 

-------- संपादित करें --------

या यह है कि आप इस पाश की वजह से ही पिछले आइटम प्रदर्शित संभव है?

foreach (object item in oSelection) 
{ 
    Outlook.MailItem mi = (Outlook.MailItem)item; 
    myTextbox.Text = mi.Body.ToString(); //<--- Only last items text 
} 
+0

यह ठीक काम करता है , लेकिन 1 ईमेल वापस पाने का तरीका क्या है? तो केवल आपके द्वारा खींचा गया अंतिम मेल? – jefsmi

+0

क्षमा करें, मुझे यकीन नहीं है कि मैं सही ढंग से समझता हूं लेकिन यदि मैं एक आइटम खींचता हूं, तो मुझे केवल यह टेक्स्ट दिखाई देता है। यदि मैं एकाधिक का चयन करता हूं, तो उनका सभी टेक्स्ट richtextbox1 –

+0

पर आता है और इस क्रम में खींचें: मेल 1 -> उस स्पष्ट टेक्स्टबॉक्स के बाद और एक अन्य मेल खींचें -> उस स्पष्ट टेक्स्टबॉक्स के बाद और मेल 1 को फिर से खींचें इससे पहले कि आप दूसरा ड्रैग मेल दिखाएं और मेल 1 – jefsmi

0

संस्करण 14.0.0.0 Microsoft.Office.Interop.Outlook.dll की मैं Outlook.ApplicationClass वस्तु का उपयोग नहीं कर सकते हैं का उपयोग करना।

इसके बजाय मैंने आपके द्वारा दिए गए उदाहरण में Outlook.Application का उपयोग किया और यह एक आकर्षण की तरह काम करता है (विंडोज सात & आउटलुक 2007 एसपी 2 के साथ परीक्षण किया गया)। मैं & इच्छानुसार ईमेल ड्रॉप कर सकता हूं।


पुनश्च:

"यह वर्ग .नेट फ्रेमवर्क बुनियादी सुविधाओं का समर्थन करता है और अपने कोड से सीधे इस्तेमाल किया जा करने का इरादा नहीं है"

: ApplicationClass वर्ग के लिए MSDN Extract
+1

मुझे Outlook पता है। अनुप्रयोग क्लास संस्करण 14.0.0.0 में एम्बेडेड है लेकिन यह मेरा प्रश्न नहीं है। मैं मेल को ड्रैग नहीं कर सकता लेकिन अगर मैं एकाधिक मेल ड्रॉप करता हूं तो वे Outlook.explorer ("एक तरह की सूची की तरह") में सहेजे जाते हैं और मैं केवल मेल को दिखाना चाहता हूं कि मैं टेक्स्टबॉक्स में खींचूं। इस समय foreach Outlook से एक सूची trhough चला जाता है। एक्सप्लोरर और आखिरी गिराए गए मेल दिखाता है और मैं बस अपना सक्रिय मेल दिखाना चाहता हूं। – jefsmi

+0

क्या आप अपने परिदृश्य को सटीक बना सकते हैं? प्रारंभिक उदाहरण में आप एक ईमेल खींच रहे हैं जबकि आपकी आखिरी टिप्पणी में आपको कई ईमेल का चयन खींचने का मतलब है। –

+0

मैं सिग्नल ईमेल खींच रहा हूं। मेरा स्कैनरियो: [# 1]। टेक्स्टबॉक्स में ईमेल_1 खींचें = ठीक ==> मैं टेक्स्टबॉक्स साफ़ करता हूं [# 2]। टेक्स्टबॉक्स में ईमेल_2 खींचें = ठीक ==> मैं टेक्स्टबॉक्स साफ़ करता हूं [# 3]। टेक्स्टबॉक्स में ईमेल_1 खींचें = ठीक नहीं है (यह ईमेल_2 दिखाता है)। यह है कि ईमेल_2 ActiveExplorer में अंतिम मेल था और मेरे foreach loop में अंतिम मेल इटिम होगा। – jefsmi

1

मैंने एलबी के जवाब को अपडेट किया। उनके DragEnter इवेंट हैंडलर ने स्वचालित रूप से माना कि उपयोगकर्ता Outlook से कुछ में गिरा दिया गया है।

परिणाम यह था कि यदि उपयोगकर्ता किसी और चीज (फ़ाइल, चयनित टेक्स्ट, ...) में गिरा दिया गया है, तो कोड अभी भी Outlook में वर्तमान में चुने गए ईमेल को देखेगा और वास्तव में जो भी गिराया गया था उसे अनदेखा कर देगा।

कोड:

Private _Outlook As Outlook.Application = Nothing 

Private Sub Form_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load 
    _Outlook = New Outlook.Application() 
End Sub 

Private Sub Form_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles Me.DragEnter 
    Dim outlookRequiredFormats = New String() { _ 
     "RenPrivateSourceFolder", _ 
     "RenPrivateMessages", _ 
     "RenPrivateItem", _ 
     "FileGroupDescriptor", _ 
     "FileGroupDescriptorW", _ 
     "FileContents", _ 
     "Object Descriptor"} 

    If outlookRequiredFormats.All(Function(requiredFormat) e.Data.GetDataPresent(requiredFormat)) Then 
     e.Effect = DragDropEffects.Copy 
    Else 
     e.Effect = DragDropEffects.None 
    End If 
End Sub 

Private Sub Form_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles Me.DragDrop 
    Dim oExplorer As Outlook.Explorer = _Outlook.ActiveExplorer() 
    Dim oSelection As Outlook.Selection = oExplorer.Selection 
    Dim i As Integer = 0 
    For Each item As Object In oSelection 
     Dim mi As Outlook.MailItem = DirectCast(item, Outlook.MailItem) 
     mi.SaveAs("C:\YourPath\message" & i & ".msg") 
     i += 1 
    Next 

वहाँ Outlook.MailItem करने के लिए चयनित आउटलुक आइटम का एक सीधा ढला होता है। कोड इस प्रकार केवल वास्तविक ईमेल के साथ काम करता है। Outlook.MeetingItem, Outlook.ContactItem, Outlook.NoteItem और शायद अधिक को संभालना भी संभव है।

संबंधित मुद्दे