[c#] ListBox의 수평 스크롤바가 보이지 않는 문제의 해결
아이템 출력 색을 바꾸거나 하기 위해 ListBox.DrawMode를 normal 아닌 거로 변경하면 HorizontalScrollbar를 true로 해도 보이지 않는다. 이럴 땐 HorizontalExtent를 설정해 줘야 한다.
HorizontalExtent는 스크롤바를 적용할 폭을 설정하는 거다. DrawMode를 바꾸면 리스트 박스가 자동으로 계산을 하지 않기 때문에 매 아이템의 길이를 확인하고 이를 적용해 줘야 한다. 루프를 돌려 모든 아이템의 너비를 확인한 뒤 제일 큰 값을 적용해도 되지만 이는 부하가 크니까 새로 아이템을 그릴 때마다 기존 width보다 큰가 확인하고 클 때에만 새로 설정을 해 주는 게 합리적이다.
// HorizontalScrollbar = true;
List<string> List1 = new() { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaa" };
private void Form1_Click(object sender, EventArgs e)
{
listBox1.DataSource = List1;
}
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
if (e.Index >= 0)
{
e.Graphics.DrawString(List1[e.Index], e.Font, Brushes.Black, e.Bounds);
int sizeF = (int)e.Graphics.MeasureString(List1[e.Index], listBox1.Font).Width;
if (sizeF > listBox1.HorizontalExtent)
{
listBox1.HorizontalExtent = sizeF;
}
}
}