c#列表框显示索引范围
本文关键字:索引 范围 显示 列表 | 更新日期: 2023-09-27 18:13:27
我有一个列表框,我想显示一个标签显示:
滚动查看ZZZ的XXX到XYY项。
我如何做到这一点,因为使用SelectedIndex将不会有用,因为我希望标签更新,即使没有选择。(也滚动,它不选择一个项目)。
更新:例如,我的列表框中有200个项目。由于列表框的高度,我每次只能显示10个项目。所以标签应该是:
显示200项中的第1至第10项
或
显示200项中的第5至15项
然而,我必须考虑到可能没有选择任何索引,因为我可以简单地滚动而不选择任何内容
您可以使用listbox.TopIndex
获得顶部索引值,使用listbox.Items.Count
获得计数,但如果不从listbox.GetItemHeight()
和listbox.ClientSize.Height
的结果计算,我看不到任何方法可以获得底部项目:
int visibleCount = listBox1.ClientSize.Height / listBox1.ItemHeight;
this.Text = string.Format("{0:d} to {1:d} of {2:d}", listBox1.TopIndex + 1, listBox1.TopIndex + visibleCount, listBox1.Items.Count);
这可以在计时器上完成,因为我看到没有滚动事件
使用列表框的滚动事件。哦,等等,没有。您可以添加一个:
public class ListBoxEx : ListBox {
public event EventHandler Scrolling;
private const int WM_VSCROLL = 0x0115;
private void OnScrolling() {
if (Scrolling != null)
Scrolling(this, new EventArgs());
}
protected override void WndProc(ref Message m) {
base.WndProc(ref m);
if (m.Msg == WM_VSCROLL)
OnScrolling();
}
}
一旦你使用了这个,它只是数学(根据需要重构):
private void listBoxEx1_Resize(object sender, EventArgs e) {
DisplayRange();
}
private void listBoxEx1_Scrolling(object sender, EventArgs e) {
DisplayRange();
}
private void DisplayRange() {
int numFrom = listBoxEx1.TopIndex + 1;
int numTo = numFrom + (listBoxEx1.ClientSize.Height / listBoxEx1.ItemHeight) - 1;
this.Text = numFrom.ToString() + " to " + numTo.ToString();
}
如果是IntegralHeight=False
,那么您可能必须使用范围数来确定是否包含部分行。
如果使用DrawMode=OwnerDrawVariable
,则需要使用MeasureItem事件循环遍历可见行。
这是一个绘制,你可以这样做
private int min = 1000;
private int max = 0;
private void comboBox3_DrawItem(object sender, DrawItemEventArgs e)
{
if (min >= e.Index) min = e.Index+1;
if (max <= e.Index) max = e.Index+1;
float size = 10;
System.Drawing.Font myFont;
FontFamily family = FontFamily.GenericSansSerif;
System.Drawing.Color animalColor = System.Drawing.Color.Black;
e.DrawBackground();
Rectangle rectangle = new Rectangle(2, e.Bounds.Top + 2,
e.Bounds.Height, e.Bounds.Height - 4);
e.Graphics.FillRectangle(new SolidBrush(animalColor), rectangle);
myFont = new Font(family, size, FontStyle.Bold);
e.Graphics.DrawString(comboBox3.Items[e.Index].ToString(), myFont, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + rectangle.Width, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
e.DrawFocusRectangle();
label1.Text = String.Format("Values between {0} and {1}",min,max);
}
你必须找到正确的事件来重置最小值和最大值,并找到正确的值来重新绘制组合框。
这段代码不是一个解决方案,它只是你如何实现你的需求的一个想法。
问好。