Проблема с WebBrowser HtmlElements, событиями doubleClick и строкой indexof (C #) - PullRequest
0 голосов
/ 22 октября 2018

Вроде бы 3 вопроса, но это не так.

Я делаю простой редактор HTML в VS 2017.NET Framework 4.6.1 с использованием C #.

Предполагается, что редактор работаетаналогично «инспектору» в веб-браузере.Если вы откроете инспектор, вы можете щелкнуть любой элемент в веб-браузере, и вы найдете исходный код элемента и сможете изменить текст (конечно, в Инспекторе вы не можете сохранить исходный файл, и поэтому, когда страница перезагружает всевозвращается к тому, что было).Мой редактор должен делать это, но поскольку исходный файл находится на жестком диске, вы можете сохранить изменения.Также предполагается, что можно вручную ввести код HTML.Я хочу, чтобы пользователь мог редактировать текст веб-страницы, не зная HTML, и позволить человеку, который знает HTML, создавать веб-страницу с нуля.

Я получил форму с разделенной панелью с двумя панелями.На панели один имеется два текстовых поля, а на панели два - веб-браузер.Первое расширенное текстовое поле, rtbTextEditor на первой панели, предназначено для записи HTML-кода, который будет читаться веб-браузером wbrBrowser на второй панели.Второе расширенное текстовое поле на первой панели rtbUserTextEditorOnlyText предназначено только для тестирования различных событий или методов и создания некоторых строк для целей отладки.На данный момент есть еще одна особенность, но она не относится к проблеме.

Вот события, которые я использую:

private void WbrBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    HtmlElementCollection Elements = wbrBrowser.Document.Body.All;
    foreach (HtmlElement elem in Elements)
    {
        elem.DoubleClick += new HtmlElementEventHandler(WbrBrowser_MouseDoubleClick);
    }
}

Возможно, это проблема, но я сделалтак можно попытаться повторно использовать код, потому что я хочу делать одно и то же независимо от того, какой элемент дважды щелкнул: переместите фокус на rtbTextEditor и поместите курсор в то место, где начинается InnerText из HtmlElement.Вот как я это сделал:

private void WbrBrowser_MouseDoubleClick(object sender, HtmlElementEventArgs e)
{
    rtbTextEditor.SelectionStart = 0;
    HtmlElement elem = (HtmlElement)sender;
    rtbTextEditor.Focus();
    string start = elem.InnerText;
    if (wbrBrowser.DocumentText.IndexOf(start) == -1)//not found
    {
        rtbUserTextEditorOnlyText.Text = @"String not found in: " + elem.TagName;
    }
    else
    {
        rtbTextEditor.SelectionStart = wbrBrowser.DocumentText.IndexOf(start);
    }
}

Здесь начинается самое интересное: это работает для двух элементов, а для последнего - нет.Просто для ясности, это HTML-код:

<html>
    <head>
        <title>IntroPage editing page</title>
    <body>
        <h1 id ="testing">Wanna change this! Now here is some text to try some different things with.</h1>
        <div>Hello from DIV</div><p>So here is another element, a "p" element, let's try to make this a little more generic..</p>
    </body>
    </head>
</html>

Теперь, для DIV-элемента и H1-элемента, это работает просто отлично.Курсор переместится прямо перед словом «Хочу», если я дважды щелкну текст "Wanna change this! Now here is some text to try some different things with." в веб-браузере.И курсор прыгает прямо перед "Hello", когда я дважды щелкаю "Hello from DIV".Но для текста внутри P-элемента это происходит:

Точка останова, когда строка не найдена, хотя вы можете видеть это своими глазами

Может кто-нибудьвидите что не так и предлагаете решение?Пожалуйста, скажите мне, если вам нужна дополнительная информация.

...