Как я могу изменить текст и ссылку LinkLabel Windows Forms

Я хотел бы, чтобы только ссылка и весь текст были доступны для кликов и оба динамически устанавливались. Я не знаю, чем их заменить. Я попробовал код ниже, и когда он вызывается более одного раза, я получаю ошибку null pointer exception.

Я пытался использовать это:

void setLink(string label, string link)
{
    linkLabel1.Text = label;

    if (linkLabel1.Links.Count > 0)
    {
        linkLabel1.Links.RemoveAt(0);
    }

    linkLabel1.Links.Add(0, label.Length, link);
}

это вызывается следующим образом:

foreach(Foo f in fooArr) {
   setLink(f.name, f.url);
   // ... do something
} 

Foo is:

public class Foo
{
  public string name { get; set; }
  public string url { get; set;  }
}

и fooArr просто List<Foo>


person Jack    schedule 20.12.2014    source источник


Ответы (1)


Поскольку коллекция LinkLabel.Links ссылается на начальную позицию и длину строки метки с гиперссылкой, я считаю, что существует проблема, если в коллекции LinkLabel.Links уже есть более одной ссылки, которая ссылается на существующую Text. Когда вы заменяете текст и только первую ссылку, это означает, что существующие ссылки теперь ссылаются на части строки, которые длиннее новой строки, и/или могут создаваться перекрывающиеся ссылки.

linkLabel1.Text = "A really long link and I'm linking the last bit";
linkLabel1.Links.Add(0, 5, "www.removeme.com");
var longLength = linkLabel1.Text.Length;
linkLabel1.Links.Add(longLength - 5, longLength - 1, "endofstring.com");
setLink("short", "newlink.com"); // What about endofstring.com?

Если я вас правильно понял, вы хотите каждый раз заменять весь текст и все ссылки, поэтому это легко исправить с помощью Links.Clear() для удаления всех ссылок:

void setLink(string label, string link)
{
    linkLabel1.Text = label;
    linkLabel1.Links.Clear();
    linkLabel1.Links.Add(0, label.Length, link);
}
person StuartLC    schedule 20.12.2014
comment
Проверка if даже не нужна, а Clear() намного лучше, чем RemoveAt() (в этом контексте). Спасибо! - person Jack; 20.12.2014
comment
FWIW: Реализация LinkLabel предотвращает перекрывающиеся ссылки, но используемая логика может не соответствовать вашим ожиданиям или ожиданиям. - person Tom Bogle; 22.12.2020