Outlook VSTO - Memanggil TypeText pada lemparan Pilihan Perintah ini tidak tersedia Pengecualian

Memanggil TypeText pada Selection memunculkan "Perintah ini tidak tersedia." pengecualian

masukkan deskripsi gambar di sini

Di bawah ini adalah kode saya

public void AddFilePaths(List<string> urls)
{
    if (urls.Count > 0)
    {
        MailItem mi = null;
        bool newMailItem = false;

        mi = MyAddIn.Application.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
        mi.Body = "New email body"; 
        newMailItem = true;

        mi.Display();
        inspector = MyAddIn.Application.ActiveInspector();

        if (mi != null)
        {
            foreach (var url in urls)
            {
                AddPathToActiveInspector(urls);
            }
        }
    }
}

public void AddLinkToCurrentInspector(string url)
{
    var inspector = MyAddIn.Application.ActiveInspector();
    var currMessage = inspector.CurrentItem;
    Microsoft.Office.Interop.Word.Document word = currMessage.GetInspector.WordEditor; 
    dynamic wordapp = word.Application;
    const string text = "\n"; // thisfor some reason will not add new line
    Microsoft.Office.Interop.Word.Selection sel = word.Windows[1].Selection;
    sel.TypeText(text); // this often errors
    string address = url;
    string subAddress = "";
    string screenTip = "";
    string textToDisplay = url; 
    wordapp.ActiveDocument.Hyperlinks.Add(sel.Range, ref address, ref subAddress, ref screenTip, ref textToDisplay);
    if (word.ProtectionType != Microsoft.Office.Interop.Word.WdProtectionType.wdNoProtection) word.Unprotect(); 
    sel.TypeText(" "); 
}

person pixel    schedule 16.08.2016    source sumber


Jawaban (2)


Anda tidak perlu memanggil TypeText - cukup setel properti Teks:

Application.ActiveInspector.WordEditor.Application.Selection.Text = "test"
person Dmitry Streblechenko    schedule 16.08.2016
comment
Sayangnya, hal itu tidak ada bedanya. Terima kasih Dmitry - person pixel; 17.08.2016
comment
Apakah Anda memanggil inspektur ini dalam mode edit? Atau apakah itu inspektur read-only? - person Dmitry Streblechenko; 17.08.2016
comment
Saya memperbarui posting saya untuk memasukkan kode. Terima kasih Dmitry - person pixel; 17.08.2016
comment
Mengapa Anda menggunakan MailItem.GetInspector jika Anda sudah memiliki objek Inspector? Juga jangan gunakan Window.Selection - gunakan Application.Selection. - person Dmitry Streblechenko; 17.08.2016
comment
Jika Anda melihat tangkapan layar yang saya posting, saya menggunakan Application.Selection (lihat tangkapan layar di atas wordapp.Selection). Sama untuk MailItem.GetInspector. Jika Anda melihat tangkapan layar, Anda akan melihat bahwa saya telah menggunakan objek Inspektur yang ada dari ActiveInspector. Jadi, saya tidak yakin apa yang Anda maksud tetapi sebenarnya itu adalah sumber dari semua masalah. Kode yang saya perbarui sebenarnya berfungsi. Dmitry sangat dihargai. BTW, bagaimana cara mengatur inspektur agar selalu dalam mode edit? Sangat dihargai - person pixel; 17.08.2016
comment
Terlihat pada baris word = currMessage.GetInspector.WordEditor. Anda menggunakan GetInspector. Tidak perlu - Anda dapat menggunakan nilai dari 'MyAddIn.Application.ActiveInspector' - person Dmitry Streblechenko; 17.08.2016
comment
Saya tahu, tapi itu adalah kode yang benar-benar berfungsi Dmitry :). Jika Anda melihat tangkapan layar yang saya posting awalnya, Anda akan melihat bahwa saya menggunakan MyAddIn.Application.ActiveInspector dan itu menyebabkan banyak masalah bagi saya. Dalam mode debug terutama ketika saya akan melihatnya crash pada baris yang memanggil Selection.TypeText(text) (atau Selection.Text = text, atau Selection.InsertAfter(text)). - person pixel; 17.08.2016

Berdasarkan jawaban dalam pertanyaan ini, saya juga menyelesaikan masalah ini. Kode yang berfungsi lebih baik daripada kode di atas dan lebih mudah diikuti ada di bawah. Terima kasih banyak kepada @joeshwa:

    public void AddLinkToCurrentInspector(string url)
    {
        object link = url;
        object result = "url";
        object missing = Type.Missing;

        var inspector = MyAddIn.Application.ActiveInspector();
        MailItem currMessage = inspector.CurrentItem;
        Microsoft.Office.Interop.Word.Document doc = currMessage.GetInspector.WordEditor;
        Microsoft.Office.Interop.Word.Selection sel = doc.Windows[1].Selection;
        doc.Hyperlinks.Add(sel.Range, ref result, ref missing, ref missing, ref link, ref missing);
        sel.EndKey(Microsoft.Office.Interop.Word.WdUnits.wdLine);
        sel.InsertAfter("\n");
        sel.MoveDown(Microsoft.Office.Interop.Word.WdUnits.wdLine);
    }
person pixel    schedule 18.08.2016