c#列表框显示索引范围

本文关键字:索引 范围 显示 列表 | 更新日期: 2023-09-27 18:13:27

我有一个列表框,我想显示一个标签显示:

滚动查看ZZZ的XXX到XYY项。

我如何做到这一点,因为使用SelectedIndex将不会有用,因为我希望标签更新,即使没有选择。(也滚动,它不选择一个项目)。

更新:例如,我的列表框中有200个项目。由于列表框的高度,我每次只能显示10个项目。所以标签应该是:

显示200项中的第1至第10项

显示200项中的第5至15项

然而,我必须考虑到可能没有选择任何索引,因为我可以简单地滚动而不选择任何内容

c#列表框显示索引范围

您可以使用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);
    }

你必须找到正确的事件来重置最小值和最大值,并找到正确的值来重新绘制组合框。

这段代码不是一个解决方案,它只是你如何实现你的需求的一个想法。

问好。