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

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


它确实适用于新的追随者。对于这些,我有一个名为 grpFollow 的 GroupBox,我将 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 只是一个将用户 ID 传递给 Twitter API 并返回该用户的名称和屏幕名称的函数。工作正常,没问题。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:这段代码在后台worker的RunWorkerCompleted方法中,此后不再执行代码。


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


桃花长相依
浏览 134回答 1
1回答

烙印99

这里的错误是我假设,LinkLabels 需要一个相对于表单的位置。但是,当将它们添加到 GroupBox 的 Controls 集合时,它们会自动假定相对于 GroupBox 而不是 Form 的位置。所以,我的代码现在对于所有四个组框基本相同,如下所示:PopulateGroup(newFollowers, grpFollow);PopulateGroup(unFollow, grpLost);PopulateGroup(newFriends, grpFriends);PopulateGroup(unFriend, grpDitched);和:private void PopulateGroup(List<string> collPeople, GroupBox groupBox){&nbsp; &nbsp; var folTop = new Point(12, 25);&nbsp; &nbsp; foreach (var fol in collPeople)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var kvp = LookupUser(fol);&nbsp; &nbsp; &nbsp; &nbsp; if (string.IsNullOrEmpty(kvp.Key)) continue;&nbsp; &nbsp; &nbsp; &nbsp; var linklabel = new LinkLabel()&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Text = kvp.Value,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Width = 200,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Height = 15,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Location = folTop&nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; &nbsp; ctr++;&nbsp; &nbsp; &nbsp; &nbsp; linklabel.Links.Add(0, linklabel.Width - 1, $"https://twitter.com/{kvp.Key}");&nbsp; &nbsp; &nbsp; &nbsp; linklabel.Click += Linklabel_Click;&nbsp; &nbsp; &nbsp; &nbsp; groupBox.Controls.Add(linklabel);&nbsp; &nbsp; &nbsp; &nbsp; folTop.Y += 25;&nbsp; &nbsp; }}因此,组框是在表单的左侧还是右侧,顶部还是底部并不重要......
打开App,查看更多内容
随时随地看视频慕课网APP