c # listbox получить отображаемый диапазон индексов - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть список, и я хотел бы отобразить метку, отображающую:

прокрутка пунктов от XXX до XYY в ZZZ.

как мне это сделать, потому что использование SelectedIndex не будет полезным, так как я бы хотел, чтобы ярлык обновлялся, даже когда ничего не выбрано (прокрутка тоже не выбирает пункт).

обновление: например, у меня есть 200 пунктов в моем списке. в любой момент я могу отображать только 10 элементов из-за высоты моего списка. поэтому на этикетке должно быть написано:

отображение пунктов с 1 по 10 из 200

или

отображаются пункты с 5 по 15 из 200

однако я должен принять во внимание, что не может быть никаких выбранных индексов, потому что я могу просто прокрутить и ничего не выбирать.

Ответы [ 3 ]

4 голосов
/ 04 ноября 2011

Вы можете получить верхнее значение индекса с помощью 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 голос
/ 04 ноября 2011

Просто используйте событие прокрутки ListBox.Ой, подождите, нет ни одного.Вы можете добавить одно:

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.

0 голосов
/ 04 ноября 2011

Это ничья, вы можете сделать это

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

Вы должны найти правильное событие для сброса минимальных и максимальных значений и правильные значения для перерисовки комбинированного списка.

Этот код не является решением, это всего лишь идея того, как вы можете реализовать свое требование.

С наилучшими пожеланиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...