以编程方式添加的 LinkLabel 不可见
Programmatically added LinkLabel not visible
我遇到一个奇怪的现象:我有一个带有四个 GroupBox 的 WinForms 应用程序,这四个最初都是空的。我用它来跟踪 Twitter 上的新 followers/unfollowers,计划在它正常运行后扩大它的使用。
它确实对新粉丝有效。对于这些,我有一个名为 grpFollow 的 GroupBox,我向其中添加了 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 和 returns 该用户的名称和 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:这段代码在后台worker的RunWorkerCompleted方法中,此后不再执行任何代码。
知道为什么标签不显示吗?
编辑:我该死!
我刚刚将 grpFriends LinkLabel 的位置更改为 10,10:看起来,juuust 剪切了我朋友组的下边框。
现在这对我来说很奇怪:
如您所见,该组的 Y 值为 351。点 (10,10) 甚至不应该在框中。因此,位置似乎是罪魁祸首,原始代码在表单外创建了标签。
用 grpFriends.Top - grpFriends.Height
替换 Y 值 grpFriends.Top
让我更接近。 LinkLabel 比我想要的离顶部更远,但这还不错。
很奇怪。
好的,感谢@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;
}
}
所以分组框在表单的左边还是右边,顶部还是底部并不重要...
我遇到一个奇怪的现象:我有一个带有四个 GroupBox 的 WinForms 应用程序,这四个最初都是空的。我用它来跟踪 Twitter 上的新 followers/unfollowers,计划在它正常运行后扩大它的使用。
它确实对新粉丝有效。对于这些,我有一个名为 grpFollow 的 GroupBox,我向其中添加了 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 和 returns 该用户的名称和 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:这段代码在后台worker的RunWorkerCompleted方法中,此后不再执行任何代码。
知道为什么标签不显示吗?
编辑:我该死! 我刚刚将 grpFriends LinkLabel 的位置更改为 10,10:看起来,juuust 剪切了我朋友组的下边框。
现在这对我来说很奇怪:
如您所见,该组的 Y 值为 351。点 (10,10) 甚至不应该在框中。因此,位置似乎是罪魁祸首,原始代码在表单外创建了标签。
用 grpFriends.Top - grpFriends.Height
替换 Y 值 grpFriends.Top
让我更接近。 LinkLabel 比我想要的离顶部更远,但这还不错。
很奇怪。
好的,感谢@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;
}
}
所以分组框在表单的左边还是右边,顶部还是底部并不重要...