c#listbox显示索引范围

时间:2011-11-04 11:35:57

标签: c# winforms

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

滚动浏览ZZZ的项目XXX到XYY。

我该怎么做呢,因为使用SelectedIndex会没用,因为我希望即使没有选择任何内容也要更新标签。 (滚动,也不选择项目。)

更新: 例如,我的列表框中有200个项目。在任何时候我只能显示10个项目,因为我的列表框的高度。所以标签应为:

显示项目1到10的200

显示200到

的第5至15项

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

3 个答案:

答案 0 :(得分:3)

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

这可以在计时器上完成,因为我看不到滚动事件。

答案 1 :(得分:1)

只需使用ListBox的Scroll事件即可。哦等等,没有一个。您可以添加一个:

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事件遍历可见行。

答案 2 :(得分:0)

这是一个Draw,你可以这样做

    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);
    }

你必须找到正确的事件来重置最小值和最大值以及正确的值来重绘组合框。

此代码不是解决方案,只是了解如何实现您的需求。

最好的问候。