以编程方式添加的LinkLabel不可见

时间:2019-01-15 12:55:24

标签: c# winforms linklabel

我遇到一个奇怪的现象:我有一个带有四个GroupBox的WinForms应用程序,所有四个最初都是空的。我使用它来跟踪Twitter上的新关注者/取消关注者,并计划在此功能正常运行后扩大其使用范围。

它确实适合新关注者。对于这些,我有一个名为grpFollow的GroupBox,在其中添加了具有新关注者的ScreenNames的LinkLabels,如下所示:

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只是一个将用户ID传递到Twitter API并返回该用户的名称和screen_name的函数。效果很好,没问题。 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不会显示,即第二个组框(在视觉上)保持空白!

我已经设置了一个断点来检查可能出了什么问题。我单步执行:检索了正确的屏幕名称,位置正确,添加了控件-但什么都没显示。

P.S:此代码在后台工作程序的RunWorkerCompleted方法中,此后将不再执行任何代码。

知道为什么不显示标签吗?

编辑:我该死! 我只是将grpFriends LinkLabel的位置更改为10,10:它出现了,刚好裁剪了我朋友组的下边框。

现在这对我来说很奇怪: grpFriends location values

如您所见,该组的Y值为351。点(10,10)甚至不应在框中。因此,位置似乎是罪魁祸首,原始代码在表格外部创建了标签。

grpFriends.Top代替grpFriends.Top - grpFriends.Height作为Y值使我离得更近。 LinkLabel比我想要的离顶部更远,但这还不错。

很奇怪。

1 个答案:

答案 0 :(得分:0)

好吧,感谢@raBinn,我弄清楚了。我认为这里的错误是LinkLabels需要相对于Form的位置。但是,将它们添加到GroupBox的Controls集合时,它们会自动采用相对于GroupBox而不是Form的位置。

因此,我的代码现在对于所有四个分组框基本相同,如下所示:

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;
    }
}

因此,组框是位于窗体的左侧还是右侧,顶部还是底部都没有关系...