通过WinForms WebBrowser控件向SharePoint RichText控件输入数据

时间:2010-10-08 06:28:54

标签: javascript html sharepoint browser controls

我需要通过WinForms Web浏览器控件编辑SP Rich Text字段中的值。大多数其他控件(输入标签)很容易获得,我们可以非常简单地更改值。但是,Rich Text并不那么简单。我前往: http://blog.drisgill.com/2007_05_01_archive.html

并得到了一些想法。起初,我尝试创建一个javascript函数并将其添加到页面中:

function GetRichTextRange(strBaseElementID)
    var docEditor=RTE_GetEditorDocument(strBaseElementID);
    if (docEditor == null)
    { return; }
    var selection = docEditor.selection;
    var range = selection.createRange();
    return range;
}

但是,每次我调用它时,我总是得到一个null值。所以我尝试了这个:

object docEditor = document.InvokeScript("RTE_GetEditorDocument", new object[] { fieldName });
IHTMLDocument2 doc = (IHTMLDocument2)docEditor;
IHTMLSelectionObject selection = doc.selection;
IHTMLTxtRange textRange = (IHTMLTxtRange)selection.createRange();
textRange.pasteHTML(value);

好吧,现在我在第二行收到错误:“无法将'System.DBNull'类型的对象强制转换为'mshtml.IHTMLDocument2'

我甚至不确定我是否正在转换为正确的对象类型,但无论如何,似乎我从RTE_GetEditorDocument函数返回的是System.DBNull。

我想做的就是说像myRichTextHtmlElement.SetAttribute(“value”,html);但显然无法做到。

更糟糕的是,我对javascript完全不熟悉,而且我更像是一个WinForms人,所以我的HTML并不是很热门的东西。下面是我的RichText字段的HTML:

<tr>
  <td nowrap="true" valign="top" width="190px" class="ms-formlabel">
    <h3 class="ms-standardheader">
      <nobr>RichText</nobr>
    </h3>
  </td>
  <td valign="top" class="ms-formbody">
    <!-- FieldName="RichText"
             FieldInternalName="RichText"
             FieldType="SPFieldNote"
          -->
    <span dir="none">
      <div class='ms-rtestate-field ms-rtefield' style=''>
        <div id='ctl00_m_g_29d60052_5630_4981_8452_850a87a50b56_ctl00_ctl05_ctl07_ctl00_ctl00_ctl04_ctl00_ctl00_TextField_inplacerte_label'
             style='display:none'>Rich text editor
        </div>
        <div class=' ms-rtestate-write ms-rteflags-0'
             id='ctl00_m_g_29d60052_5630_4981_8452_850a87a50b56_ctl00_ctl05_ctl07_ctl00_ctl00_ctl04_ctl00_ctl00_TextField_inplacerte'
             style='min-height:84px'
             aria-labelledby='ctl00_m_g_29d60052_5630_4981_8452_850a87a50b56_ctl00_ctl05_ctl07_ctl00_ctl00_ctl04_ctl00_ctl00_TextField_inplacerte_label'
             contentEditable='true' >
          <div class="ExternalClassD74B4D64D01941CDB34619757AAA30D8">
            <html>
              <body>
                <h4>A Definition List:</h4>
                <dl>
                  <dt>Coffee</dt>
                  <dd>Black hot drink</dd>
                  <dt>Milk</dt>
                  <dd>White cold drink</dd>
                </dl>
              </body>
            </html>
          </div>
        </div>
        <div style="clear:both;"></div>
      </div>
      <span dir="ltr">
        <input name="ctl00$m$g_29d60052_5630_4981_8452_850a87a50b56$ctl00$ctl05$ctl07$ctl00$ctl00$ctl04$ctl00$ctl00$TextField_spSave"
               type="HIDDEN"
               id="ctl00_m_g_29d60052_5630_4981_8452_850a87a50b56_ctl00_ctl05_ctl07_ctl00_ctl00_ctl04_ctl00_ctl00_TextField_spSave" />
      </span>
    </span>
  </td>
</tr>

有人有任何想法吗?谢谢!

3 个答案:

答案 0 :(得分:0)

你必须使用winforms webbrowser控件吗?可以在winform中使用他们想要的任何html代码编辑器并捕获结果并使用sharepoint Web服务或对象模型(取决于用例)来更新项目作为替代选项。

答案 1 :(得分:0)

AFAIK没有办法通过DOM做到这一点。 iMacros Web自动化工具可以populate these Rich Text fields,但我认为它们使用Windows挂钩(没有DOM)。

答案 2 :(得分:0)

好吧,经过大量的拔毛后,我得到了答案,这比我想象的要简单。一旦我得到了正确的HtmlElement(id为“..... TextField_inplacerte”的div),那么我需要做的就是:

HtmlElement element = document.GetRichTextFieldCell(fieldName);

if (element != null)
{
   element.InnerHtml = value;
   element.SetAttribute("value", value);
}

我可能不需要SetAttribute位,所以稍后我会在没有该行的情况下尝试相同的事情。

无论如何,谢谢你们。 : - )