Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со ссылками, в компоненте текстового редактора  
:(
    Опции темы
AHgpeu
Дата 29.12.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Нужно добавить в текст ссылку как объект (со своими полями и методами).
Как например в ComboBox можно добавить объект и показать его Caption.
То же самое нужно для ссылки. Кто-то может подсказать куда смотреть?

Сейчас мучаю RichTextBox. Но если есть альтернативы - буду только рад!
--------------------
ᆉᆈǀƿᆇᆆᆅᆂᆁᆇᆆ
PM MAIL   Вверх
tol05
Дата 29.12.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



какой именно ComboBox используете? Винформс или WPF? 

В зависимости от этого детали реализации могут отличаться. Но общим принцип один: 
- создавать коллекцию объектов пользовательского класса (например класс MyClass со свойствами Caption, Value... что там еще..)
- коллекцию биндить к ComboBox как Source (ItemSource, BindingSource - нужно смотреть по конкретной технологии, о чем я выше говорил)
- указывать для ComboBox, что именно свойство Caption айтема будет использоваться в качестве display member 

в любом случае нужно смотреть в сторону binding-а ComboBox к коллекции пользовательских объектов (или к одному объекту, но который все равно выступает как binding source)


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
AHgpeu
Дата 29.12.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



tol05, вы меня не поняли
Цитата

Как например в ComboBox можно добавить объект и показать его Caption.

Это не вопрос. А пример того что мне нужно.
Только объект мне нужно добавить не в комбобоксе. А в каком-нибудь текстовом редакторе.

типа такого:
Код

TextBox.Text.AddObject(MyObject, "MyCaption")


--------------------
ᆉᆈǀƿᆇᆆᆅᆂᆁᆇᆆ
PM MAIL   Вверх
tol05
Дата 29.12.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



теперь понятно еще меньше. 

Что значит "добавить"? Обратитесь к свойству MyObject.MyCaption, получите строку, добавьте к тексту конкатенацией


Цитата(AHgpeu @  29.12.2009,  11:27 Найти цитируемый пост)
Как например в ComboBox можно добавить объект

Цитата(AHgpeu @  29.12.2009,  11:27 Найти цитируемый пост)
Сейчас мучаю RichTextBox

Цитата(AHgpeu @  29.12.2009,  11:27 Найти цитируемый пост)
Но если есть альтернативы - буду только рад

альтернатив - много. Ровно столько же, сколько Кол-воКонтролов Х Кол-воИхСвойств

Это не ответ. А пример того, что я сейчас думаю
 smile 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
AHgpeu
Дата 29.12.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



tol05, ну вот смотрите.
В моем тексте есть несколько ссылок (они НЕ являются ссылками на стр. в интернет). Эти ссылки просто указывают что на какое-то слово или фразу можно нажать и произойдет какое-то действие.
Мне бы хотелось чтобы каждая такая ссылка являлась объектом. И По нажатию на нее - я бы мог вытащить этот объект и сделать свой метод
Код

MyLinkObject.DoMethod();


А у объекта MyLinkObject есть поле, например ID
и в зависимости от этого ID в
Код

MyLinkObject.DoMethod();

выполняются различные действия
--------------------
ᆉᆈǀƿᆇᆆᆅᆂᆁᆇᆆ
PM MAIL   Вверх
tol05
Дата 29.12.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(AHgpeu @  29.12.2009,  12:29 Найти цитируемый пост)
Мне бы хотелось чтобы каждая такая ссылка являлась объектом. И По нажатию на нее - я бы мог вытащить этот объект и сделать свой метод

ок. эти ссылки имеют какое-то визуальное представление? В виде UI контрола? Если Вы хотите на нее нажимать - значит да, есть. Создаете event-handler для клика на этих контролах. Биндите хандлер ко всем контролам без исключения.
К контролу биндите свой объект. Как угодно, через DataSource, Source, BindingSource ... да хоть через Tag. Это зависит от того, какой контрол будет представлять Вашу ссылку (визуально).
Главное, чтобы можно было в хандлере (через параметр sender или eventArgs) добраться до прибинденного объекта MyLinkObject.

ну а дальше - все просто. Вставляете в текущую позицию целевого контрола значение MyLinkObject.Caption





--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
AHgpeu
Дата 29.12.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Цитата

эти ссылки имеют какое-то визуальное представление? В виде UI контрола? Если Вы хотите на нее нажимать - значит да, есть............


мм.. не совсем так. Эти ссылки - всего лишь текст в компоненте RichTextBox. Но так как они "помечены как ссылка" (как если бы это был текст "http://forum.vingrad.ru") - то они кликабельны.
--------------------
ᆉᆈǀƿᆇᆆᆅᆂᆁᆇᆆ
PM MAIL   Вверх
tol05
Дата 29.12.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



мда. наконец-то все прояснилось. К чему только Combobox вспоминать было?
судя по RichTextBox.DetectUrls Property можно написать обработчик события LinkClicked и в нем работать с LinkText. Создавать например объект MyLinkObject. 
Или искать его в уже существующей коллекции объектов MyLinkObject по критерию MyLinkObject.LinkText == clickedLinkText и вызывать у него DoMethod().




--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
AHgpeu
Дата 29.12.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



к сожалению в тексте могут быть ссылки с идентичными LinkText
Но они должны будут выполнять разные действия.
Поэтому сравнение со стандартным LinkText не прокатит.....
т.е. 
Код

MyLinkObject_1.LinkText == MyLinkObject_n.LinkText

но, конечно же
Код

MyLinkObject_1.Id != MyLinkObject_n.Id


Добавлено через 1 минуту и 46 секунд
именно поэтому нужно "вытащить" из clickedLink сам объект MyLinkObject
...
Так же как это делалось бы для ComboBox'a, в который тоже запихнули Object
--------------------
ᆉᆈǀƿᆇᆆᆅᆂᆁᆇᆆ
PM MAIL   Вверх
tol05
Дата 29.12.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



создайте Dictionary<MyKey, MyLinkObject> и заполняйте его при загрузке документа в  RichTextBox
MyKey - какой-нибудь ключ, указывающий на позицию линка относительно начала документа.

Т.о. гарантируется логическая идентификация линков с одиннаковым текстом. Кроме того, для линков с одинаковым текстом возможно задавать как различные объекты MyLinkObject, так и один и тот же объект.

Событие clickedLink все равно обрабатывать прийдется. Но в обработчике главной задачей будет выяснение позиции линка относительно начала документа (ключа), и нахождение в словаре нужного объекта MyLinkObject по этому ключу.
Думаю это будет не очень сложно.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
AHgpeu
Дата 30.12.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



tol05, но как узнать позицию линка относительно начала документа?
Учитывая, что линки могут иметь один и тот же текст
поиск по 
Код

e.LinkText

будет некорректно работать
--------------------
ᆉᆈǀƿᆇᆆᆅᆂᆁᆇᆆ
PM MAIL   Вверх
tol05
Дата 30.12.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



я бы обошел последовательно весь документ, для каждого линка запомнил его startPosition и endPosition (в строке текста). Также можно запомнить номер строки.
Все это я бы сохранил в структуре, которая будет ключом словаря для конкретного линка.

потом
Код

private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
{
    int currentPosition = richTextBox1.GetCharIndexFromPosition(new Point(e.X, e.Y));

    //пройти по всем ключам и определить, попадает ли текущая позиция в диапазон 
    //startPosition...endPosition для какого-нибудь линка? Если да - вернуть 
    //соответствующий объект
    MyLinkObject = GetLinkObjectFromDictionary(currentPosition);

    if (MyLinkObject != null)
    {
        // работа с MyLinkObject 
    }
}

Событие clickedLink в таком случае можно и не обрабатывать.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0680 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.