我需要通过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>
有人有任何想法吗?谢谢!
答案 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位,所以稍后我会在没有该行的情况下尝试相同的事情。
无论如何,谢谢你们。 : - )