Просто используйте событие прокрутки 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.