2015-03-20 2 views
1

Есть ли способ разместить несколько ссылок в элементе управления LinkLabel в Windows Forms?Есть ли способ разместить несколько ссылок в элементе управления LinkLabel в Windows Forms

Если бы я просто установить его как этот

this.linkLabel.Text = ""; 
foreach (string url in urls) 
{ 
    this.linkLabel.Text += url + Environment.NewLine; 
} 

он сливает его в одну ссылку.

Заранее спасибо.

+1

Возможный дубликат [Link Labels C# - отображение их списка] (http://stackoverflow.com/questions/4712191/link-labels-c-sharp-displaying-a-list-of-them) – MethodMan

+0

@ MethodMan Это не дубликат этого вопроса. Этот вопрос связан с добавлением нескольких элементов управления LinkLabel к другому элементу управления. Это связано с добавлением нескольких ссылок на один «LinkLabel», который не упоминается нигде в связанном вопросе. – Anthony

ответ

5

Да, хотя это не так, что я могу сказать, чтобы сделать это непосредственно из конструктора, но это легко управлять с помощью кода:

var linkLabel = new LinkLabel(); 
linkLabel.Text = "(Link 1) and (Link 2)"; 
linkLabel.Links.Add(1, 6, "Link data 1"); 
linkLabel.Links.Add(14, 6, "Link data 2"); 
linkLabel.LinkClicked += (s, e) => Console.WriteLine(e.Link.LinkData); 

В основном Links коллекции на этикетке может разместите кучу ссылок в LinkLabel. Событие LinkClicked содержит ссылку на конкретную ссылку, которая была нажата, чтобы вы могли, среди прочего, получить доступ к данным о ссылках, связанным с этой ссылкой.

Дизайнер предоставляет только объект LinkArea, который по умолчанию включает весь текст LinkLabel. Первый Link, который вы добавляете в коллекцию Links, автоматически изменит свойство LinkArea, чтобы отобразить первую ссылку в коллекции.

Что-то немного ближе к тому, что вы спрашиваете, будет выглядеть следующим образом:

var addresses = new List<string> { 
    "http://www.example.com/page1", 
    "http://www.example.com/page2", 
    "http://www.example.com/page3", 
}; 

var stringBuilder = new StringBuilder(); 
var links = new List<LinkLabel.Link>(); 

foreach (var address in addresses) 
{ 
    if (stringBuilder.Length > 0) stringBuilder.AppendLine(); 

    // We cannot add the new LinkLabel.Link to the LinkLabel yet because 
    // there is no text in the label yet, so the label will complain about 
    // the link location being out of range. So we'll temporarily store 
    // the links in a collection and add them later. 
    links.Add(new LinkLabel.Link(stringBuilder.Length, address.Length, address));   
    stringBuilder.Append(address); 
} 

var linkLabel = new LinkLabel(); 
// We must set the text before we add the links. 
linkLabel.Text = stringBuilder.ToString(); 
foreach (var link in links) 
{ 
    linkLabel.Links.Add(link); 
} 
linkLabel.AutoSize = true; 
linkLabel.LinkClicked += (s, e) => { 
    System.Diagnostics.Process.Start((string)e.Link.LinkData); 
}; 

Я прилагаю сам URL, как LinkData к так что я могу извлечь Линк я создаю в цикле это как строка при запуске события LinkClicked.

+0

Большое спасибо, но ваше решение не работает, когда адреса содержат, например, следующие URL-адреса: «http: //www.example/1», «http: //www.example/1/ 2 "и' "http: //www.example/1/3". Каков наилучший способ исправить это? – FrozenHeart

+0

Я думал об этом сразу после публикации, но не имел доступа к компьютеру, чтобы изменить свой ответ. В принципе, вам нужно просто создать свой текст самостоятельно, используя StringBuilder и отслеживать местоположение ссылок по мере их добавления. См. Пример измененного кода. – Anthony

Смежные вопросы