【问题标题】:Programmatically added LinkLabel not visible以编程方式添加的 LinkLabel 不可见
【发布时间】:2019-01-15 12:55:24
【问题描述】:

我遇到了一个奇怪的现象:我有一个带有四个 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 没有显示,即第二个组框(视觉上)保持为空!

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

P.S:这段代码在后台worker的RunWorkerCompleted方法中,此后不再执行代码。

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

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

现在这对我来说很奇怪:

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

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

很奇怪。

【问题讨论】:

  • 我知道这听起来很愚蠢,但你试过 addind Visible = true 吗?
  • @krobelusmeetsyndra 我没有,因为我假设 Visible 默认为真,并且第一个 LinkLabels 确实出现而没有明确设置。添加Visible=true - 什么都没有。添加了BringToFront() - 什么都没有。 :-(
  • 尝试重命名您的链接标签。我只是在这里做了一个快速测试,得到了同样的问题——groupBox 1 没有显示任何链接标签,即使它们是以编程方式添加的。让我知道这是否有效,如果有效,我会回答这个问题。
  • @krobelusmeetsyndra 不是吗。请参阅我编辑的代码。行为上还没有区别。 P.S:我将第二个标签组向右和向下移动了一点,以防它重叠。也没有交易。
  • 我会尝试分配位置 X = 0 和 Y = (grpFriends.Top + LinkLabel.height) 以证明您确实在创建控件(在容器外)。如果可行,那么您将它们放置在面板中的位置是相对的

标签: c# winforms linklabel


【解决方案1】:

好的,感谢@raBinn,我想通了。这里的错误是我假设,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)
{
    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;
    }
}

所以分组框是在表单的左侧还是右侧、顶部还是底部并不重要...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2015-04-19
    • 2013-07-09
    相关资源
    最近更新 更多