今天做一个功能,一个LinkLabel上显示信息为“ 附件('附件个数')”,并在鼠标指针移动到此LinkLabel上的时候弹出一个框依序显示相应数量的LinkLabel,把对应附件名称绑定到LinkLabel上,点击LinkLabel打开对应附件。本来之前是用的ToolTip实现附件名称的依序显示,但是后来需求变动,要求实现上述功能。其他功能都已经实现但是在动态添加LinkLabel并显示滚动条的时候遇到了问题,首先是动态添加LinkLabel,我把代码简化了一下,现在的附件名称都放在ArrayList1中,这里之前的代码是:
for (int i = 0; i < ArrayList1.Count; i++)
{
LinkLabel ll = new LinkLabel();
ll.Text = (i + 1).ToString() + "、" + ArrayList1[i].ToString();
ll.Dock = DockStyle.Top;
panel1.Controls.Add(ll);
}
执行后,发现附件名称倒序排列了,而且没有滚动条显示。没有滚动条显示是正常的,改成如下代码后滚动条显示:
panel1.AutoScroll = true;
for (int i = 0; i < ArrayList1.Count; i++)
{
LinkLabel ll = new LinkLabel();
ll.Text = (i + 1).ToString() + "、" + ArrayList1[i].ToString();
ll.Dock = DockStyle.Top;
panel1.Controls.Add(ll);
}
现在就是名称倒序显示的问题了,试着把ll.Dock = DockStyle.Top改成ll.Dock = DockStyle.Bottom,名称正序显示,但是想到一个问题:如果附件数很少,panle1的大小不变的话,LinkLabel就都在底部了,这个问题可以通过动态设置panel1的高度来解决,得到LinkLabel的高度为23,那么改为如下代码即可:
panel1.Height = ArrayList1.Count * 23;
for (int i = 0; i < ArrayList1.Count; i++)
{
LinkLabel ll = new LinkLabel();
ll.Text = (i + 1).ToString() + "、" + ArrayList1[i].ToString();
ll.Dock = DockStyle.Bottom;
panel1.Controls.Add(ll);
}
现在的问题是如果附件数量比较大,那么panel1的高度会很高,这样看着不舒服,而且根据显示器的分辨率设置,当附件达到一定数量时会显示不全,那么还是需要滚动条。那么,如何让附件正序显示并显示滚动条呢,改为如下代码即可:
panel1.AutoScroll = true;
for (int i = 0; i < ArrayList1.Count; i++)
{
LinkLabel ll = new LinkLabel();
ll.Text = (i + 1).ToString() + "、" + ArrayList1[i].ToString();
ll.Dock = DockStyle.Top;
panel1.Controls.Add(ll);
ll.BringToFront();
}
可以自行设置panel1的长宽,这不在文章讨论范围,就不赘述。关键代码是ll.BringToFront();,把这行代码放在panel1.Controls.Add(ll);之后即可正序排列,加上前面的ll.Dock = DockStyle.Top就不会出现附件数量少的时候显示在panel1底部的问题了。但是这里要注意的是ll.BringToFront();一定要写在panel1.Controls.Add(ll);后面,如果写在前面,附件还是会倒序排列。
当然,也可以设置LinkLabel的Location值来达到正序排列的要求,但是我感觉设置Dock要方便一点,而且这个问题既然没有解决,那么一定是要解决的,所以我一直是用Dock属性来进行排序的。设置Location来实现正序排序很简单,我就不多说了。
另外,我用RichTextBox试了一下,使用以上代码只能实现附件的正序排列,滚动条不能出现,即使加上richTextBox1.ScrollBars = RichTextBoxScrollBars.ForcedVertical;这句代码,滚动条也是灰色状态,无法滚动,具体原因待研究。