Входные данные в элемент управления RichText SharePoint с помощью элемента управления WinForms WebBrowser - PullRequest
1 голос
/ 08 октября 2010

Мне нужно отредактировать значение в поле SP Rich Text через элемент управления веб-браузера WinForms.Большинство других элементов управления (входные теги) легко получить, и мы можем изменить значение довольно просто.Однако не все так просто с 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;
}

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

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 не совсем горячий материал.Ниже приведен 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>

У кого-нибудь есть идеи?Спасибо!

Ответы [ 3 ]

0 голосов
/ 10 октября 2010

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

0 голосов
/ 11 октября 2010

Что ж, после долгих выдергиваний я получил ответ, и он оказался проще, чем я думал. Как только я получил правильный HtmlElement (div с идентификатором "..... TextField_inplacerte"), все что мне нужно было сделать, это:

HtmlElement element = document.GetRichTextFieldCell(fieldName);

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

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

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

0 голосов
/ 08 октября 2010

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

...