插入超链接后如何将光标定位在Word文档中?

问题描述

我有一个Outlook插件,它通过提供addAttachment()处理程序并将超链接插入电子邮件正文中的每个附件来处理电子邮件附件的添加

插入超链接没问题,但是如果通过将附件拖动到电子邮件中来添加附件,则插入光标将始终保留在超链接之前。

                Document doc = currentMailItem.GetInspector.WordEditor;
                Selection objSel = doc.Windows[1].Selection;
                Range insertRange = objSel.Range;
                object missObj = Type.Missing;
                Hyperlink link = doc.Hyperlinks.Add(insertRange,MyUrl,missObj,displayName,missObj);
                objSel.Collapse(WdCollapseDirection.wdCollapseEnd);
                /* also tried this:
                Range r = link.Range;
                objSel.MoveRight(WdUnits.wdCharacter,r.End,r.Start);
                 * */

我怀疑我的问题可能是拖放处理。我注意到在插入的Url之后,光标出现在我放置它的位置,但随后又跳回到它之前的位置。难道是当完成拖放操作时,某些东西会将光标重置到其原始位置吗?

有人可以告诉我我需要做什么吗?

解决方法

我过去创建了一个与此项目非常相似的项目,并选择使用MailItem.HTMLBody属性而不是与对象放置作斗争。

就我而言,我正在构建一个数据网格,但是可以构造类似的东西来接收您的URL数据。注意:这是在我开发的初期,代码可能需要一些重构,但是对于过去的复制和粘贴,我希望它还不错。我还从这篇文章中排除了一些不必要的信息,但是最重要的部分都包含在这里。

为了组装电子邮件的正文,此方法创建一个StringBuilder并逐段构造HTML文档。

        public string ConstructBody(DataTable dataTable)
        {
            StringBuilder bodyStringBuilder = new StringBuilder();

            // Creates the HTML code,constructs body,Constructs table,defines table border.
            bodyStringBuilder.AppendLine("<html>");
            bodyStringBuilder.AppendLine(Tab + "<body>");
            bodyStringBuilder.AppendLine(Tab + Tab + "<table>");
            bodyStringBuilder.AppendLine(Tab + Tab + "<table border='2' bgcolor:#DDDDDD bordercolor:black>");

            // Column headers - Style defined.
            bodyStringBuilder.Append(Tab + Tab + Tab + "<tbody align='center' style='font-family:verdana; color:#000000; font-size:14;background-color:#9DB9C8'>");
            bodyStringBuilder.Append(Tab + Tab + Tab + "<tr>");

            // Column Headers - Named 
            foreach (DataColumn dc in dataTable.Columns)
            {
                bodyStringBuilder.AppendFormat("<th>{0}</th>",dc.ColumnName);
            }

            // End of Column Header Creation
            bodyStringBuilder.AppendLine("</tr>");

            // Empty data rows created and filled by another foreach loop
            int drColorSwitch = 1;

            foreach (DataRow dr in dataTable.Rows)
            {
                if (IsOdd(drColorSwitch))
                {
                    bodyStringBuilder.Append(Tab + Tab + Tab + Tab + "<tbody align='center' style='font-family:verdana;background-color=#DDDDDD; color:#000000; font-size:14 '>");
                }
                else
                {
                    bodyStringBuilder.Append(Tab + Tab + Tab + Tab + "<tbody align='center' style='font-family:verdana;background-color=#BDD0D9; color:#000000; font-size=14 '>");
                }
                bodyStringBuilder.Append(Tab + Tab + Tab + "<tr>");
                drColorSwitch ++;

                // Fills the data. 
                foreach (DataColumn dc in dataTable.Columns)
                {
                    string cellValue = dr[dc] != null ? dr[dc].ToString() : "";
                    bodyStringBuilder.AppendFormat("<td>{0}</td>",cellValue);
                }

                // Closes out each datarow
                bodyStringBuilder.AppendLine("</tr>");
            }  // End of the datarow creation functions

            // Closes the table,closes the body,and finally ends the HTML code for the body of the email. 
            bodyStringBuilder.AppendLine(Tab + Tab + "</table>");
            bodyStringBuilder.AppendLine(Tab + "</body>");
            bodyStringBuilder.AppendLine("</html>");

            return bodyStringBuilder.ToString();                               // Finally - returns value of SB
        }

最后,在MailReport方法中,我创建电子邮件并调用Send();

public void MailReport(DataTable datatable,string[] recipients,string subject,string headertext,string reporttitle,bool includedate,bool includefiles,string[] filelist,bool isEncrypted)
        {
            // Creates instance of Header and Body Construction Classes
            HeaderConstruction headerConstruction = new HeaderConstruction(); 
            BodyConstruction bodyConstruction = new BodyConstruction();


            Outlook.Application oApp = new Outlook.Application();
            Outlook.MailItem oMsg = oApp.CreateItem(Outlook.OlItemType.olMailItem);
            foreach (string recipient in recipients)
            {
                oMsg.Recipients.Add(recipient); 
            }

            if(isEncrypted)
            {
                // If caller indicates that message should be encrypted,system will add secured flag to subject
                oMsg.Subject = "<secure> " + subject;
            }
            else
            {
                // Else,message will transmit without security flag 
                oMsg.Subject = subject;
            }

            // introduces the body table
            oMsg.HTMLBody = headerConstruction.ConstructHeader(headertext,reporttitle,includedate) + bodyConstruction.ConstructBody(datatable);

            // Includes files in output message if requested
            if (includefiles)
            {
                foreach (string path in filelist)
                {
                    oMsg.Attachments.Add(path);
                }
            }

            // Send
            oMsg.Send();       
        }