本記事では、ListViewコントロールで自動スクロールする際、選択行を常に画面内に表示させる方法について紹介します。
準備
フォームにリストビュー(listView1)を配置します。10件の項目を登録した時、10件全部は表示できないように画面の高さを低めに調整しておきます。
サンプルコード
★印のlistView1.EnsureVisibleメソッドにより選択行を画面内に表示させるようにします。
using System;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private Timer timer; // タイマーを定義
public Form1()
{
InitializeComponent();
InitializeListView(); // ListViewを初期化
SetupTimer(); // タイマーを設定
}
private void InitializeListView()
{
// ListViewをDetailsビューに設定
listView1.View = View.Details;
// 列を追加
listView1.Columns.Add("Name", -2, HorizontalAlignment.Left);
// 10個のアイテムをListViewに追加
for (int i = 0; i < 10; i++)
{
listView1.Items.Add($"Item {i + 1}");
}
// 先頭のアイテムを選択状態にする
listView1.Items[0].Selected = true;
}
// タイマーのセットアップ
private void SetupTimer()
{
// 1秒ごとにイベントが発生するよう設定
timer = new Timer();
timer.Interval = 1000; // タイマーの間隔を1秒に設定
timer.Tick += Timer_Tick; // タイマーのTickイベントにメソッドを関連付け
timer.Start(); // タイマーを開始
}
// タイマーイベントハンドラ(1秒ごとに実行)
private void Timer_Tick(object sender, EventArgs e)
{
// 現在の選択位置を取得
int selectedIndex = listView1.SelectedItems[0].Index;
// 選択を解除
listView1.Items[selectedIndex].Selected = false;
// インデックスをインクリメントし範囲外になったら0に戻す
selectedIndex++;
if (selectedIndex >= listView1.Items.Count)
{
selectedIndex = 0;
}
// 次の位置を選択
listView1.Items[selectedIndex].Selected = true;
// 選択行が表示されるようにする ★
listView1.EnsureVisible(selectedIndex);
}
}
}
実行結果
Item1 → 2 → 3 と順番に選択状態が変化します。画面外のItemを選択すると、リストビューが自動的にスクロールする動作を確認できます。
まとめ
本記事では、ListViewコントロールで自動スクロールする際、選択行を常に画面内に表示させる方法について紹介しました。