Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Soft17
1 / 1 / 1
Регистрация: 15.01.2017
Сообщений: 385
1

Как при событии нажатия на ссылку в "Webbrowser" получить аттрибуты ссылки?

11.05.2018, 16:10. Просмотров 968. Ответов 12

Планирую сделать систему управления контентом.
Состав системы:
- Дерево страниц по категориям. (Page tree by category);
- Веб-браузер. (webbrowser);

Содержание страниц:
- форматированный текст;
- картинки;
- ссылки;

Текст в формате HTML хранится в базе данных.
Дерево категорий выводит текст из базы данных в Веб-браузер.

Необходимо сделать переход между страницами.

То есть переход из страницы "Страница_1" к нужному абзацу страницы "Страница_2"
Логика:
- Пользователь. Находится на странице "Страница_1".
- Пользователь. Нажимает ссылку на странице "Страница_1".
- Браузер. Открывает страницу "Страница_2", скролит на "Абзац_N"("N" зависит от того на какой абзац ссылка на странице "Страница_1")

Переход между страницами планирую сделать с помощью ссылок "якорь"
HTML5
1
<a*href="text.html#bottom">Перейти к нижней части текста</a>
Думаю, что для выполнения данной логики нужно при нажатии на ссылку извлечь имя страницы "text.html" и использовать его, чтобы извлечь из базы данных страницу на которую указывает ссылка.

Вопросы
1. Как при событии нажатия на ссылку в "Webbrowser" получить атрибуты ссылки?
2. Какие есть более рациональные способы выполнения данной логики?
0
Миниатюры
Как при событии нажатия на ссылку в "Webbrowser" получить аттрибуты ссылки?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2018, 16:10
Ответы с готовыми решениями:

WebBrowser. Как получить Html код страницы открытой в "webBrowser" в правильной кодировке?
Пробую получить Html код страницы открытой в &quot;webBrowser&quot;. public string GetHTMLCodPage() ...

Как запретить использовать клавиши масштабирования и "Ctrl + Колесу прокрутки" и обновления страницы "F5" в WebBrowser - е ?
Как запретить использовать клавиши масштабирования и &quot;Ctrl + Колесу прокрутки&quot; и обновления...

Получить "результат" нажатия клавиши с учётом регистра и раскладки клавиатуры
Доброго времени суток господа программисты ! Вопрос вот в чём, нужно получить значение нажатия...

Ошибка "Невозможно получить дескриптор окна для элемента управления 'WebBrowser'"
Прога должна каждые 20 сек синхронизироваться с сайтом с помощью таймера: System.Timers.Timer...

WebBrowser: авторизация "забывается" при переходе по другой ссылке ресурса
Проблема в следующем, авторизуюсь на сайте,автоматически заполняя учетные данные,все хорошо,а вот...

12
diadiavova
4023 / 1429 / 443
Регистрация: 11.04.2015
Сообщений: 2,638
Записей в блоге: 35
11.05.2018, 17:26 2
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Soft17, учитывая, что страницы ты будешь формировать сам, думаю, наиболее рациональным решением будет обрабатывать клики на самой странице скриптами и отправлять сообщения программе. Например делаем такую страничку
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html>
 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title></title>
</head>
<body>
    <a href="page1.html#a1">Page 1</a>
    <a href="page1.html#a2">Page 2</a>
 
    <script>
        function a_click(evt)
        {
            evt.preventDefault();
            external.a_click(evt.target.href, evt.target.textContent);
        }
        let aa = document.querySelectorAll("a");
        for (let i = 0; i < aa.length; i++)
        {
            aa[i].addEventListener("click", a_click);
        }
    </script>
</body>
</html>
Здесь на событие click всех ссылок документа навешивается обработчик, в котором сначала запрещается стандартное поведение ссылок(то есть переход на другую страницу), хотя этого можно не делать, если вместо ссылок использовать что-то на них похожее (например span с соответствующими стилями). Далее вызывается метод a_click объекта external, которому мы передаем адрес и текст ссылки.
Объект external надо создать в программе. Для этого создадим такой класс
C#
1
2
3
4
5
6
7
8
9
    [System.Runtime.InteropServices.ComVisible(true)]
    public class BrowserExternal
    {
        public void a_click(string href, string text)
        {
            string msg = $"href: {href}; text: {text}";
            MessageBox.Show(msg);
        }
    }
В нем реализован метод, вызываемый со страницы. Далее в классе самой формы пишем что-то вроде этого
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.Navigate(System.IO.Path.Combine(Application.StartupPath, "page.html"));
            webBrowser1.ObjectForScripting = new BrowserExternal();
        }
 
    }
То есть при загрузке формы грузим страничку и передаем браузеру новый экземпляр нашего external. Теперь при клике по ссылкам будет выполняться код метода a_click.
1
Soft17
1 / 1 / 1
Регистрация: 15.01.2017
Сообщений: 385
11.05.2018, 18:57  [ТС] 3
diadiavova,
Работает.
Спасибо.

Вопросы.

1. Не могли бы вы ещё подсказать как сделать чтобы открылась страница "Страница_2" на нужном абзаце?
2. А как быть если ссылки будут вести на внешние интернет источники (сайты)?

Я сделал так.
Страница 1

Кликните здесь для просмотра всего текста
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title></title>
</head>
<body>
    <a href="NamePage2#Page2_Paragraph_2">Page2Prgrph_2</a>
    <a href="NamePage2#Page2_Paragraph_3">Page2Prgrph_3</a>
 
    <script>
        function a_click(evt)
        {
            evt.preventDefault();
            external.a_click(evt.target.href, evt.target.textContent);
        }
        let aa = document.querySelectorAll("a");
        for (let i = 0; i < aa.length; i++)
        {
            aa[i].addEventListener("click", a_click);
        }
    </script>
        <p>page1 paragraph 1</p>
        <p>page1 paragraph 2</p>
        <p>page1 paragraph 3</p>
        
        
</body>
</html>



Страница 2
Кликните здесь для просмотра всего текста
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<!DOCTYPE html>
 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title></title>
          <style>
     p {
      margin-top: 0.5em; /* Отступ сверху */
      margin-bottom: 1.0em; /* Отступ снизу */
     }
  </style>
</head>
<body>
    
    <script>
        function a_click(evt)
        {
            evt.preventDefault();
            external.a_click(evt.target.href, evt.target.textContent);
        }
        let aa = document.querySelectorAll("a");
        for (let i = 0; i < aa.length; i++)
        {
            aa[i].addEventListener("click", a_click);
        }
    </script>
        
        <p>Page2_Paragraph_1<br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string </p>
        
        
        <p>Page2_Paragraph_2</p>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string </p>
        
        
        <p>Page2_Paragraph_3</p>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string <br>
        string </p>
        
</body>
</html>


Код формы
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace rsh
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
 
        private void Form2_Load(object sender, EventArgs e)
        {
            // TODO: данная строка кода позволяет загрузить данные в таблицу "tetst01DataSet.tbl0700CMS". При необходимости она может быть перемещена или удалена.
            this.tbl0700CMSTableAdapter.Fill(this.tetst01DataSet.tbl0700CMS);
            
            webBrowser1.Navigate(System.IO.Path.Combine(Application.StartupPath, "page.html"));
            webBrowser1.ObjectForScripting = new Form2fold.BrowserExternal();
 
            dataGridView1.SelectionChanged += new EventHandler(dataGridView1_SelectionChanged);
 
        }
 
        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedCells.Count == 1)
            {
                var val = dataGridView1.SelectedCells[0].Value;
                if (val != null)                    
                    webBrowser1.DocumentText = val.ToString();
            }
        }
 
        
    }
}


Код BrowserExternal
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
// ДОБАВЛЕНО
using  System.Windows.Forms;
 
namespace rsh.Form2fold
{
    [System.Runtime.InteropServices.ComVisible(true)]
    public class BrowserExternal
    {
        public void a_click(string href, string text)
        {
            string msg = $"href: {href}; text: {text}";
            // href: about: Pagel* Page2_aragraph_2; text: Pagel
            // href: about:NamePage2*Page2_Paragraph_2; text: Page2Prgrph_2
 
 
            MessageBox.Show(msg);
        }
    }
}
0
Миниатюры
Как при событии нажатия на ссылку в "Webbrowser" получить аттрибуты ссылки?  
Soft17
1 / 1 / 1
Регистрация: 15.01.2017
Сообщений: 385
11.05.2018, 19:12  [ТС] 4
diadiavova,
Дополню.

см. предыдущий пост

Необходимо:
1. Чтобы ссылки на сайты открывались в Chrome/
2. Чтобы ссылки на страницы из базы данных открывались в "webBrowser1"
3. Чтобы ссылки на абзацы страниц из базы данных открывались в "webBrowser1" с прокруткой скролла на абзац.
0
11.05.2018, 19:12
diadiavova
4023 / 1429 / 443
Регистрация: 11.04.2015
Сообщений: 2,638
Записей в блоге: 35
11.05.2018, 23:11 5
Цитата Сообщение от Soft17 Посмотреть сообщение
1. Чтобы ссылки на сайты открывались в Chrome/
В методе a_click у тебя есть адрес по которому надо идти, проверяй что за ссылка там. Хотя можно сделать это и на странице и уже передавать эту информацию дополнительным параметром. Это уж как тебе удобнее. Открывай с помощью Process.Start, первым аргументом передавай путь к ехе-файлу хрома, вторым адрес и прочие аргументы командной строки, если таковые нужны.
Цитата Сообщение от Soft17 Посмотреть сообщение
2. Чтобы ссылки на страницы из базы данных открывались в "webBrowser1"
Здесь сразу встает вопрос: а насколько вообще принципиально, чтобы эти страницы в датабазе лежали? Если это будут просто файлы, то все будет намного проще - навигейт и все такое. Да и третий пункт решается сам собой. Если все-таки принципиально, чтобы это была датабаза, то можно страничку сохранять во временный файл непосредственно перед загрузкой и грузить оттуда. Использовать DocumentText категорически не советую, поскольку страница может работать не так как ты ожидаешь, точно всего не помню, но по-моему там скрипты работать не будут. А если так, то вопрос с программной прокруткой тоже может сильно осложниться.
Кстати вариант с сохранением временных файлов использовался документвьюером вижуал студио еще в версии 2005-ого года. В следующей версии его заменили веб-сервером, который запускался при запросе любого документа. Но там был большой архив, его надо было держать в сжатом виде. А у тебя какой резон хранить все в базе? Если бы ты хотя бы генерировал эти документы из данных базы, то это еще можно было бы понять. А так статические документы в базе только затрудняют работу с браузером, а пользы - ноль.
1
Soft17
1 / 1 / 1
Регистрация: 15.01.2017
Сообщений: 385
12.05.2018, 07:08  [ТС] 6
diadiavova,
Цитата Сообщение от diadiavova Посмотреть сообщение
А у тебя какой резон хранить все в базе?
Пока разбираюсь, что да как...
Я человек начинающий и поэтому на все мои высказывания прошу делать поправку на мою неопытность.

Аргументы расположения страниц в "таблице", а не в "файлах" считаю:
- увеличение скорости поиска текста в страницах. Т.е. предполагаю, что поиск в базе данных будет выполняться быстрее чем по "файлам";
- Если файлы: не уверен с системой имён. Иногда нужно создать файл, а как его назвать не знаешь... Называешь как попало.. Потом переименовываю часто... В данной ситуации не знаю как быть. Если переименовать то ссылки "полетят";
- предполагаю потом таблицу "страниц" связать с таблицей "событий" (с таблицей "задач", например. И др. По обстановке..);

Систему управления контентом пока предполагаю использовать:
- на одном компе;
- или в локальной сети для нескольких пользователей с разграничением прав доступа;
Платформа.
- Пока хочу сделать на WinForm.

Перспективы:
- выложить систему в Веб;
- разработать Веб интерфейс;

Состав системы.
- "Рубрикатор" (Дерево страниц по категориям. (Page tree by category);
- "Текстовый редактор" (Веб-браузер. (webbrowser);

Функционал.
"Рубрикатор" функционал:
1. В рубрикаторе располагаются страницы структурированные по категориям в дерево.
2. Возможность присваивать страницам метки.

"Текстовый редактор" функционал:
3. Форматирование текста.
4. Присвоить метки "фрагменту текста"(одной строке, нескольким строкам).
4. Размещение спойлеров.
5. Размещение фреймов.
6. Размещение ссылок на страницу.
7. Размещение ссылок на "фрагмент текста".
8. Вставка изображений из буфера обмена.

diadiavova,
Вопрос
Как это всё правильно организовать?
Буду признателен если посоветуете.
0
diadiavova
4023 / 1429 / 443
Регистрация: 11.04.2015
Сообщений: 2,638
Записей в блоге: 35
12.05.2018, 08:08 7
Цитата Сообщение от Soft17 Посмотреть сообщение
Т.е. предполагаю, что поиск в базе данных будет выполняться быстрее чем по "файлам";
Если текст содержится в виде хтмл-разметки, то можно долго искать и ничего не найти, независимо от того где он находится. Будешь например искать какой-то нужный текст, а он там содержится в виде какой-то <span class='qwerty'>нужный</span> текст. Почему я выше написал, что когда в базе содержатся некие данные, а код уже из них формируется, то это совсем другое дело.
Цитата Сообщение от Soft17 Посмотреть сообщение
Если файлы: не уверен с системой имён. Иногда нужно создать файл, а как его назвать не знаешь... Называешь как попало.. Потом переименовываю часто... В данной ситуации не знаю как быть. Если переименовать то ссылки "полетят";
Имена можно давать рандомно, но в базе держать имена, описания, метки и другие данные для того же поиска.
Цитата Сообщение от Soft17 Посмотреть сообщение
- Пока хочу сделать на WinForm.
Перспективы:
- выложить систему в Веб;
- разработать Веб интерфейс;
Ну по большому счету одно другому не мешает. Можно ведь запускать какой-нибудь IIS Express и запрашивать файлы оттуда. Тогда и клики перехватывать не надо будет, все можно обрабатывать на стороне сервера.
Цитата Сообщение от Soft17 Посмотреть сообщение
- "Текстовый редактор" (Веб-браузер. (webbrowser);
Редактор можно готовый использовать. Вот недавно только тема была Редактировать HTML в WebBrowser - Visual Basic .NET - Киберфорум
Цитата Сообщение от Soft17 Посмотреть сообщение
Как это всё правильно организовать?
Я думаю, у тебя есть идея как это сделать. Я могу подкинуть пару-тройку идей по конкретным вопросам, да и то только для того, чтобы ты рассмотрел их как возможную альтернативу и не более того.))
1
Soft17
1 / 1 / 1
Регистрация: 15.01.2017
Сообщений: 385
12.05.2018, 08:29  [ТС] 8
diadiavova,
Что-то я немного начинаю путаться...

Правильно ли я понял, что вы предлагаете следующий состав:
- Сервер;
- файлы "RandoName.html";
- На WinWorm - WebBrowser с "CKEDITOR"?


Вопросы
1. Правильно ли я понял ваше предложение по составу приложения?
2. Как сделать поиск по файлам(страницам) чтобы не было ситуации как описано ниже?
Цитата Сообщение от diadiavova Посмотреть сообщение
Будешь например искать какой-то нужный текст, а он там содержится в виде какой-то <span class='qwerty'>нужный</span> текст.
0
diadiavova
4023 / 1429 / 443
Регистрация: 11.04.2015
Сообщений: 2,638
Записей в блоге: 35
12.05.2018, 08:58 9
Цитата Сообщение от Soft17 Посмотреть сообщение
Что-то я немного начинаю путаться...
Ну так... глаза боятся, руки делают ))
Цитата Сообщение от Soft17 Посмотреть сообщение
Правильно ли я понял, что вы предлагаете следующий состав:
Нет. Я состав не предлагал. Как и сказал выше, могу предложить варианты и не более того. Что из них подойдет, а что нет - решать тебе. Могу привести некоторые аргументы в пользу моих предложений.
Например взять тот же сервер. Почему мне эта идея кажется хорошей? Ну если ты в перспективе предполагаешь все равно перенести эту логику в веб, то можно ведь сразу реализовать это дело в виде сайта и не делать одну и ту же работу дважды. Использование локального вебсервера решает эту проблему. Конечно, если тебе надо, чтобы настольная версия не зависела от того, установлен ли на целевой машине веб-сервер, то это решение не подойдет. Можно, конечно, и самому примитивный сервер намутить, но это уже и сложнее и вряд ли стоит того.
Цитата Сообщение от Soft17 Посмотреть сообщение
файлы "RandoName.html";
Ну это упростит работу с ними. Кроме того, если все-таки выбор будет сделан в пользу веб-сервера, то не будет никаких файлов, поскольку документ на сервере будет формироваться. Там данные будут содержаться в базе, а при запросах из них будут уже формироваться документы. Хотя, если содержимое файлов статично, то можно и на сервере в файлах держать. Но те же результаты поиска все равно ведь динамически формировать придется. Или как?
Цитата Сообщение от Soft17 Посмотреть сообщение
На WinWorm - WebBrowser с "CKEDITOR"?
Ну здесь опять-таки, если ты предпочитаешь делать самостоятельно, то это не нужно. Но есть готовый навороченный редактор, который можно использовать, конфигурировать, расширять и т. д. Так почему бы этим не воспользоваться?
Цитата Сообщение от Soft17 Посмотреть сообщение
Правильно ли я понял ваше предложение по составу приложения?
Еще раз повторюсь, что это были просто предложения по вариантам решения конкретных задач и не более того.))
Цитата Сообщение от Soft17 Посмотреть сообщение
Как сделать поиск по файлам(страницам) чтобы не было ситуации как описано ниже?
Я не знаю как это делается по всем правилам, но как вариант могу предложить добавить в таблицу еще одно поле, в котором будет содержаться текст без разметки и искать по нему.
1
Soft17
1 / 1 / 1
Регистрация: 15.01.2017
Сообщений: 385
12.05.2018, 10:27  [ТС] 10
diadiavova,
Цитата Сообщение от diadiavova Посмотреть сообщение
Еще раз повторюсь, что это были просто предложения по вариантам решения конкретных задач и не более того.))
Понимаю... Спасибо хоть за это...

В общем.. я уже одной ногой за сервер.


Ещё раз...

Вопрос.1
Использование сервера:
1. Если использовать ниже перечисленные вопросы упростятся и не надо ничего городить?
Цитата Сообщение от Soft17 Посмотреть сообщение
2. Чтобы ссылки на страницы из базы данных открывались в "webBrowser1"
3. Чтобы ссылки на абзацы страниц из базы данных открывались в "webBrowser1" с прокруткой скролла на абзац.
В общем я попробую сделать следующую структуру
- Сервер;
- База данных(MsSql, MySql);
- На WinWorm - WebBrowser с "CKEDITOR"

Вопрос.2
Как увязать WinWorm с сервером?

Я освоился с "Open Server"
Можно ли использовать "Open Server"?

Или можно прицепить что-то стандартное и несложное, как вы сказали - IIS Express.
Как сделать чтобы при запуске моего приложения запускался отдельный сервер этого приложения?
Есть ли какие-то другие сервера для этих целей?

Вопрос.3
Не могли бы подсказать как правильно реализовать механизм:
- нажимаем на кнопку на странице;
- Браузер. Появляется страница с данными из базы данных?


Вопрос.4
Как сделать:
- 1. Чтобы ссылки на сайты открывались в "Chrome";
- 2. Чтобы ссылки на страницы из базы данных открывались в "webBrowser1";
- 3. Чтобы ссылки на абзацы страниц из базы данных открывались в "webBrowser1" с прокруткой скролла на абзац?

Т.е. у меня два типа ссылок.
Если я применяю веб-сервер, то у меня два типа доменов:
- мой (допустим "CMS");
- немой (все остальные, которые ведут в интерент);
Т.е. перед переходом по ссылке нужно сделать какой-то "if", чтобы выбрать между двумя типами ссылок?
Если тип ссылки "мой", то открываем ссылку в "webBrowser1", если тип ссылки "немой", то используем "Process.Start" и открываем в "Chrome".
С "Process.Start" я наверное разберусь, а вот как сделать выбор между типами ссылок?


Вопрос.5
Поиск.
Как я вижу:
- есть текстовое поле (а может потом диалог сделаю);
- Пользователь. Вводит слова для поиска через пробел. Текстовый поисковый запрос: Слово1 Слово2 Слово3;
- Приложение. Формирует SQL запрос. "Пробел" рассматривает как "И". "Слово1" "И" "Слово2" "И" "Слово3";
- Приложение. Выполняет поиск в таблице базы данных в нужном поле;
- Приложение. Результат выводит отдельную ДатаТабле;
- Приложение. Результат выводит отдельную ДатаВид;
- Приложение. Результат выводит отдельную ДатаГрид со ссылками;
- Пользователь. Нажимает ссылку в ДатаГрид с результатами поиска;
- Приложение. Открывает страницу "webBrowser1";

Такая схема работы вменяемая?


Вопрос.6
Цитата Сообщение от diadiavova Посмотреть сообщение
Я не знаю как это делается по всем правилам, но как вариант могу предложить добавить в таблицу еще одно поле, в котором будет содержаться текст без разметки и искать по нему.
Как сделать сохранить текст без разметки?
Напомню содержание страниц:
- форматированный текст;
- картинки;
- ссылки;
0
diadiavova
4023 / 1429 / 443
Регистрация: 11.04.2015
Сообщений: 2,638
Записей в блоге: 35
12.05.2018, 11:17 11
Цитата Сообщение от Soft17 Посмотреть сообщение
Если использовать ниже перечисленные вопросы упростятся и не надо ничего городить?
Этот вопрос и так особо сложным не является, поэтому ответ - скорее нет. Но если проект в дальнейшем все равно предстоит переносить в веб, то это могло бы избавить от необходимости делать одну работу дважды. Не забывай о том, что написание серверной части - тоже работа и немалая, поэтому это в любом случае не проще чем просто сохранить страничку во временный файл и загрузить оттуда.
Цитата Сообщение от Soft17 Посмотреть сообщение
Как увязать WinWorm с сервером?
Да там и увязывать особо нечего. Главное запустить его, указав порт, папку и прочие нужности. А там дальше браузеру в навигейт передаешь адрес, что-то типа http://localhost:12345 и дальше работаешь как с любым вебсайтом. По сути речь идет о двух приложениях: серверном и десктопном.
Цитата Сообщение от Soft17 Посмотреть сообщение
Я освоился с "Open Server"
Можно ли использовать "Open Server"?
Не знаю что это, но думаю что подойдет. Главное, чтобы он поддерживал технологии, которые ты хочешь использовать на стороне сервера, запускался локально на компе. Возможно еще надо решить проблемы с развертыванием, ну типа можно ли его как-то распространять со своим приложением и прочая лицензионная фигня.
Цитата Сообщение от Soft17 Посмотреть сообщение
Не могли бы подсказать как правильно реализовать механизм:
- нажимаем на кнопку на странице;
- Браузер. Появляется страница с данными из базы данных?
На стороне клиента нужна только ссылка, там никакой программной реализации не потребуется. На стороне сервера запрос принимается, обрабатывается, при необходимости запрашиваются данные и на основе всего этого формируется ответ. Если делается без веб-сервера, то клик перехватывается как я показал выше и дальше из программного кода запрашиваешь базу,сохраняешь документ и грузишь его в браузер.
Цитата Сообщение от Soft17 Посмотреть сообщение
Как сделать:
- 1. Чтобы ссылки на сайты открывались в "Chrome";
- 2. Чтобы ссылки на страницы из базы данных открывались в "webBrowser1";
- 3. Чтобы ссылки на абзацы страниц из базы данных открывались в "webBrowser1" с прокруткой скролла на абзац?
Так раньше ведь написал уже об этом. Тут не имеет значения с сервера выполняется запрос или из файловой системы. По третьему пункту - после адреса добавляешь # и имя якоря. Если надо сделать это программно, то можно написать что-то типа
C#
1
2
var anchorName = "qwerty";
webBrowser1.Document.InvokeScript("eval", new object[]{$"document.location.hash = '#{anchorName}'"});
Цитата Сообщение от Soft17 Посмотреть сообщение
а вот как сделать выбор между типами ссылок?
Есть Класс Uri (System). Создай экземпляр на базе адреса, и там есть возможность узнать домен, там свойство называется Host. Но тут, возможно, лучше будет на самой странице отобрать ссылки, ведущие на внешний ресурс и программно обрабатывать только их, а локальные грузить обычным способом, но это опять-таки вариант.
Цитата Сообщение от Soft17 Посмотреть сообщение
Такая схема работы вменяемая?
На сервере можно генерировать результаты запроса в виде хтмл и просматривать в браузере, когда будешь делать веб-версию все равно придется делать так.
Цитата Сообщение от Soft17 Посмотреть сообщение
Как сделать сохранить текст без разметки?
Напомню содержание страниц:
- форматированный текст;
- картинки;
- ссылки;
Ну, если загрузить документ в браузер, то
C#
1
var text = webBrowser1.Document.Body.InnerText;
Можно поработать со всякими библиотеками для работы хтмл, типа Html Agility Pack | HAP.
0
Soft17
1 / 1 / 1
Регистрация: 15.01.2017
Сообщений: 385
12.05.2018, 12:34  [ТС] 12
diadiavova,
Спасибо.

Не могли помочь ещё чуть-чуть "дожать" этот вопрос.

У меня немного уже каша в голове, поэтому прошу извинить если вопросы нелогичны.

Вопрос1
Цитата Сообщение от diadiavova Посмотреть сообщение
На стороне клиента нужна только ссылка, там никакой программной реализации не потребуется. На стороне сервера запрос принимается, обрабатывается, при необходимости запрашиваются данные и на основе всего этого формируется ответ.
Как на ваш взгляд это сделать?
Понимаю, что вопрос элементарный, но в упор не понимаю как это сделать.

Использую "Open Server":
- Apache - 2,4х64;
- PHP - 5,6х64;

Сделал:
- запустил сервер;
- создал папку домена;
- папка домена пуста (см. скирн) http://cmstexst1:81/;
- в базе данных сделал страницу с ссылкой на страницу "Page_2".
HTML5
1
<a href="http://cmstexst1:81/Page_2">Ссылка на страницу Page_2</a><br>
Как сделать переход по ссылке?
Единственное что мне на ум приходит это:
- В папку домена положить шаблон страницы "СтраницаШаблон.html";
- WinForm.webBrowser1. Кликаем по ссылке;
- Приложение. Извлекает номер страницы из ссылки;
- Приложение. Передаёт номер страницы "СтраницаШаблон.html";
...
а дальше не знаю..


Вопрос2
Цитата Сообщение от diadiavova Посмотреть сообщение
Сообщение от Soft17
а вот как сделать выбор между типами ссылок?
Есть Класс Uri (System). Создай экземпляр на базе адреса, и там есть возможность узнать домен, там свойство называется Host. Но тут, возможно, лучше будет на самой странице отобрать ссылки, ведущие на внешний ресурс и программно обрабатывать только их, а локальные грузить обычным способом, но это опять-таки вариант.
Тоже не понимаю как это сделать...
Обращу внимание, что ссылки буду собраны не в одном месте, а могут находится внутри текста.
Т.е. в перемешку с текстом...
Пример
Текст1, Текст2, Текст3,
Текст4, ССЫЛКА, Текст5,
Текст6, Текст7, Текст8,
0
Миниатюры
Как при событии нажатия на ссылку в "Webbrowser" получить аттрибуты ссылки?  
diadiavova
4023 / 1429 / 443
Регистрация: 11.04.2015
Сообщений: 2,638
Записей в блоге: 35
12.05.2018, 14:23 13
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Цитата Сообщение от Soft17 Посмотреть сообщение
Как сделать переход по ссылке?
Ну на странице у тебя скрипт, хотя лучше его в отдельный файл выделить, учитывая, что он везде использоваться будет. Скрипт обрабатывает клики по ссылкам, отменяет стандартное действие и передает адрес и текст в программу. Тебе надо обработать это как тебе надо. Программа получает данные в классе BrowserExternal, который прямого доступа к браузеру не имеет и таким образом сейчас может обрабатывать только внешние ссылки, поскольку хром можно открыть откуда угодно. Наиболее простой способ решения - это передача ссылки на браузер в конструкторе класса.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    [System.Runtime.InteropServices.ComVisible(true)]
    public class BrowserExternal
    {
        WebBrowser browser;
 
        public BrowserExternal(WebBrowser browser)
        {
            this.browser = browser;
        }
 
        public void a_click(string href, string text)
        {
            var uri = new Uri(href);
            if (uri.Host == "cmstexst1")
            {
                browser.Navigate(uri);
            }
            else
            {
                Process.Start(@"C:\Program Files(x86)\Google\Chrome\Application\chrome.exe", href);
            }
        }
    }
И соответственно там где создается экземпляр надо написать
C#
1
webBrowser1.ObjectForScripting = new BrowserExternal(webBrowser1);
По-другому можно прямо на странице цеплять этот обработчик только на внешние ссылки, а внутренние грузить естественным образом.
1
12.05.2018, 14:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2018, 14:23

Необработанное исключение типа "System.NullReferenceException" при работе с WebBrowser
Доброго времени суток! Срочно понадобилась программа. Опыта в VS не имею, посмотрел урок по...

Как получить ссылку нового окна в WebBrowser
Здравствуйте! У меня есть форма с элементом WebBrowser. Всё работает нормально. Но при открытии...

Обработка нажатия клавиши "Ctrl" совместно с клавишей "+"
Скажите, пожалуйста, как обработать нажатие клавиши &quot;Сtrl&quot; совместно с клавишей &quot;+&quot;?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru