Программно добавленный LinkLabel не виден

Я сталкиваюсь со странным явлением: у меня есть приложение WinForms с четырьмя групповыми ячейками, все четыре изначально пустые. Я использую это для отслеживания новых подписчиков / отписчиков в Твиттере, планируя расширить его использование, как только это будет работать должным образом.

Это действительно работает для новых последователей. Для этого у меня есть GroupBox с именем grpFollow, к которому я добавляю LinkLabels с ScreenNames моих новых подписчиков, например:

var folTop = new Point(grpFollow.Left + 5, grpFollow.Top + 5);
lblFollowers.Text = Properties.Settings.Default.FollowersNow.Count.ToString();
lblFriends.Text = Properties.Settings.Default.FriendsNow.Count.ToString();
var ctr = 1;
foreach (var fol in newFollowers)
{
    var kvp = LookupUser(fol);
    if (string.IsNullOrEmpty(kvp.Key)) continue;
    var linklabel = new LinkLabel()
    {
        Text = kvp.Value,
        Width = 200,
        Height = 15,
        Location = folTop,
        Visible = true,
        Name = $"follbl{ctr}"
    };
    ctr++;
    linklabel.Links.Add(0, linklabel.Width-1, $"https://twitter.com/{kvp.Key}");
    linklabel.Click += Linklabel_Click;
    grpFollow.Controls.Add(linklabel);
    folTop.Y += 25;
}

LookupUser - это просто функция, которая передает идентификатор пользователя в API Twitter и возвращает имя и имя экрана этого пользователя. Работает нормально, без проблем. LinkLabels добавлен красиво, никаких проблем там тоже нет.

Беда с другими групповыми блоками, например, для новых друзей:

folTop = new Point(grpFriends.Left + 15, grpFriends.Top + 15);
ctr = 1;
foreach (var fol in newFriends)
{
    var kvp = LookupUser(fol);
    if (string.IsNullOrEmpty(kvp.Key)) continue;
    var llabel = new LinkLabel()
    {
        Text = kvp.Value,
        Width = 200,
        Height = 15,
        Location = folTop,
        Visible = true,
        Name = $"frdlbl{ctr}"
    };
    ctr++;
    llabel.Links.Add(0, llabel.Width - 1, $"https://twitter.com/{kvp.Key}");
    llabel.Click += Linklabel_Click;
    grpFriends.Controls.Add(llabel);
    folTop.Y += 25;
}

Как видите, логика идентична (потому что я хочу извлечь эту часть в отдельный метод, чтобы избежать повторения). Расположение задается относительно группового блока grpFriends, все остальное тоже самое. Тем не менее, LinkLabel не отображается, то есть второй групповой блок остается (визуально) пустым!

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

PS: этот код находится в методе RunWorkerCompleted фонового работника, после этой точки дальнейший код не выполняется.

Есть идеи, почему ярлык не отображается?

Изменить: я буду проклят! Я просто изменил местоположение LinkLabel grpFriends на 10,10: кажется, только что обрезав нижнюю границу группы моих друзей.

Теперь вот где это становится странным для меня:

Как видите, значение Y для группы составляет 351. Точка (10,10) даже не должна быть в рамке. Таким образом, кажется, что это виновник, и оригинальный код создал метку вне формы.

Замена grpFriends.Top как значение Y с grpFriends.Top - grpFriends.Height дайте мне ближе. LinkLabel дальше вниз, чем хотелось бы, но это не так уж плохо.

Очень странно.

1 ответ

Решение

Хорошо, благодаря @raBinn, я понял это. Я допустил ошибку, предполагая, что LinkLabels нужно расположение относительно формы. Однако при добавлении их в коллекцию Controls GroupBox они автоматически принимают местоположение относительно GroupBox, а не формы.

Итак, мой код теперь в основном одинаков для всех четырех групповых блоков и выглядит так:

PopulateGroup(newFollowers, grpFollow);
PopulateGroup(unFollow, grpLost);
PopulateGroup(newFriends, grpFriends);
PopulateGroup(unFriend, grpDitched);

А также:

private void PopulateGroup(List<string> collPeople, GroupBox groupBox)
{
    var folTop = new Point(12, 25);
    foreach (var fol in collPeople)
    {
        var kvp = LookupUser(fol);
        if (string.IsNullOrEmpty(kvp.Key)) continue;
        var linklabel = new LinkLabel()
        {
            Text = kvp.Value,
            Width = 200,
            Height = 15,
            Location = folTop
        };
        ctr++;
        linklabel.Links.Add(0, linklabel.Width - 1, $"https://twitter.com/{kvp.Key}");
        linklabel.Click += Linklabel_Click;
        groupBox.Controls.Add(linklabel);
        folTop.Y += 25;
    }
}

Так что на самом деле не имеет значения, находится ли групповое поле слева или справа, сверху или снизу формы...

Другие вопросы по тегам