2010-10-08 2 views
1

Мне нужно изменить значение в поле Rich Rich Text с помощью элемента управления веб-браузером WinForms. Большинство других элементов управления (входных тегов) легко получить, и мы можем легко изменить значение. Однако, не очень просто с Rich Text. Я направился в: http://blog.drisgill.com/2007_05_01_archive.htmlВходные данные в SharePoint RichText Управление с помощью WinForms Управление WebBrowser

и получил некоторые идеи. Сначала я попытался creatign в яваскрипте функции и добавить его на страницу:

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

Однако каждый раз, когда я называю это, я всегда получить нулевое значение обратно. Так что я попытался вместо этого:

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"

I я даже не уверен, что в любом случае я верю в правильный тип объекта, но в любом случае кажется, что я возвращаюсь из функции RTE_GetEditorDocument из System.DBNull.

Все, что я хочу сделать, это сказать что-то вроде myRichTextHtmlElement.SetAttribute ("value", html); но этого, очевидно, не может быть сделано.

Чтобы усугубить ситуацию, я совершенно не знаком с javascript, и я больше человек из WinForms, поэтому мой HTML не совсем горячий материал. Ниже приведен HTML-код для моего поля RichText:

<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

Другая вещь, которая только что перешла мне на ум; Я предполагаю, что «strBaseElementID» - это имя поля SP. В этом случае я передаю имя «RichText», которое является именем моего тестового поля RichText. Это даже то, что я должен проезжать или что-то еще? Название звучит немного странно, и я также попытался передать атрибут HtmlElement.ID, но безрезультатно ...: -s – Matt

ответ

0

Вам нужно использовать элемент управления веб-браузерами winforms? Можно использовать любой редактор HTML-кода, который они хотели бы получить в winform, и получить результаты и использовать веб-службы sharepoint или объектную модель (в зависимости от варианта использования) для обновления элемента в качестве альтернативного варианта.

0

AFAIK нет возможности сделать это через DOM. Инструмент автоматизации сети iMacros может populate these Rich Text fields, но я думаю, что они используют для этого Windows-крючки (без DOM).

0

Ну, после много вытягивания волос, я получил ответ, и это было проще, чем я думал. После того, как я получил правильный HTMLElement (в DIV с идентификатором «..... TextField_inplacerte»), то все, что мне нужно было сделать это:

HtmlElement element = document.GetRichTextFieldCell(fieldName); 

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

я, вероятно, не нужно немного SetAttribute, поэтому я попытаюсь то же самое позже без этой линии.

Спасибо всем, ребята. :-)