Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Работа со ссылками


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

Сейчас мучаю RichTextBox. Но если есть альтернативы - буду только рад!

Автор: tol05 29.12.2009, 12:54
какой именно ComboBox используете? Винформс или WPF? 

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

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

Автор: AHgpeu 29.12.2009, 13:00
tol05, вы меня не поняли
Цитата

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

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

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

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


Автор: tol05 29.12.2009, 13:14
теперь понятно еще меньше. 

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


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

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

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

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

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

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

MyLinkObject.DoMethod();


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

MyLinkObject.DoMethod();

выполняются различные действия

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

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

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



Автор: AHgpeu 29.12.2009, 14:13
Цитата

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


мм.. не совсем так. Эти ссылки - всего лишь текст в компоненте RichTextBox. Но так как они "помечены как ссылка" (как если бы это был текст "http://forum.vingrad.ru") - то они кликабельны.

Автор: tol05 29.12.2009, 14:45
мда. наконец-то все прояснилось. К чему только Combobox вспоминать было?
судя по http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.detecturls.aspx можно написать обработчик события LinkClicked и в нем работать с LinkText. Создавать например объект MyLinkObject. 
Или искать его в уже существующей коллекции объектов MyLinkObject по критерию MyLinkObject.LinkText == clickedLinkText и вызывать у него DoMethod().


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

MyLinkObject_1.LinkText == MyLinkObject_n.LinkText

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

MyLinkObject_1.Id != MyLinkObject_n.Id


Добавлено через 1 минуту и 46 секунд
именно поэтому нужно "вытащить" из clickedLink сам объект MyLinkObject
...
Так же как это делалось бы для ComboBox'a, в который тоже запихнули Object

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

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

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

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

e.LinkText

будет некорректно работать

Автор: tol05 30.12.2009, 17:46
я бы обошел последовательно весь документ, для каждого линка запомнил его 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 в таком случае можно и не обрабатывать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)