이번 글에서는 리스트박스에 대해서 알아보겠습니다. 사용자에게 여러 개의 항목을 표시하기 위해 사용되며 간단한 목록을 표현하는데 사용됩니다.
속성
리스트박스 박스에서 자주 사용되는 속성은 아래와 같습니다.
속성, 함수 | 설명 |
---|---|
Items | ListBox에 추가된 아이템을 관리하는 컬렉션 Add, AddRange, Remove, RemoveAt, Clear 등의 함수를 사용 |
SelectedIndex | 선택된 아이템의 인덱스 |
SelectedItem | 선택된 아이템 |
SelectionMode | 아이템 선택 모드를 지정 (단일, 다중 선택 등) SelectionMode.None SelectionMode.One SelectionMode.MultiSimple SelectionMode.MultiExtended |
ScrollAlwaysVisible | 스크롤 표시 설정 |
Sorted | 아이템 정렬 |
단일 선택, 다중 선택 리스트 박스가 있고, 아이템을 추가, 삭제하는 샘플 프로그램을 만들어보겠습니다. WinForm 프로젝트 생성 후 아래와 같이 디자인을 해줍니다.
단일 선택 리스트박스
폼 Load 이벤트 함수에 아래와 같이 입력해줍니다.
private void Form1_Load(object sender, EventArgs e)
{
listBox1.ScrollAlwaysVisible = true; // 항상 스크롤바 보이게
//listBox1.SelectionMode = SelectionMode.One; // 단일 선택(기본값)
}
listBox1은 단일 선택, listBox2는 다중 선택이 가능한 컨트롤입니다. 단일 선택은 SelectionMode에 SelectionMode.One이 기본값으로 설정 되어 있어서 굳이 코드를 입력하지 않으셔도 사용 가능합니다. 또한 SelectionMode는 MultiSimple과 MultiExtended가 있는데 두 개 SelectionMode에 설정 시 다중 선택이 가능한 속성값이지만 MultiSimple은 아이템을 클릭만 해도 선택/선택해제가 되며 MultiExtended는 Ctrl과 Shift키와 마우스 클릭 조합을 통해 다중 선택이 가능합니다.
다음으로 ‘추가’, ‘삭제’, ‘모두 삭제’, ‘정렬’ 버튼 Click 이벤트 함수에 아래와 같이 코딩해줍니다.
private void btnAdd_Click(object sender, EventArgs e)
{
// 추가 버튼
if (tbInput.Text == string.Empty)
return;
listBox1.Items.Add(tbInput.Text); // 텍스트 박스의 문자열을 리스트박스에 추가
}
private void btnDelete_Click(object sender, EventArgs e)
{
// 삭제 버튼
if (listBox1.SelectedItem == null)
return;
listBox1.Items.Remove(listBox1.SelectedItem); // 선택한 항목 한개 삭제
}
private void btnDeleteAll_Click(object sender, EventArgs e)
{
// 모두 삭제 버튼
listBox1.Items.Clear();
}
private void btnSort_Click(object sender, EventArgs e)
{
// 정렬 버튼
listBox1.Sorted = !listBox1.Sorted;
string strMsg = $"정렬 속성값이 [{listBox1.Sorted}]으로 설정되었습니다.";
MessageBox.Show(strMsg);
}
실행하면 아래와 같이 동작합니다.
다중 선택 리스트박스
다중 선택을 하기 위해서는 SelectionMode에 SelectionMode.MultiExtended을 설정해줍니다. 폼 Load 이벤트 함수에 아래와 같이 코딩해줍니다.
private void Form1_Load(object sender, EventArgs e)
{
listBox2.ScrollAlwaysVisible = true; // 항상 스크롤바 보이게
listBox2.SelectionMode = SelectionMode.MultiExtended; // 다중 선택 가능. Ctrl, Shift 키와 마우스 클릭으로 조합
}
10,000개의 아이템을 추가하는 버튼과 선택한 항목을 삭제하는 버튼의 Click 이벤트 함수를 만들어 줍니다.
private void btnMultiAdd_Click(object sender, EventArgs e)
{
// 10000개 아이템 추가 버튼
listBox2.BeginUpdate(); // 화면 갱신을 일시적으로 중지
for (int i = 0; i < 10000; i++)
{
string strItem = i.ToString();
listBox2.Items.Add(strItem);
}
listBox2.EndUpdate(); // 화면 갱신을 다시 시작
}
private void btnMultiDelete_Click(object sender, EventArgs e)
{
// 선택한 항목 삭제 버튼
listBox2.BeginUpdate(); // 화면 갱신을 일시적으로 중지
// 삭제는 역순으로 해야함
for (int iSelectIndex = listBox2.SelectedItems.Count - 1; 0 <= iSelectIndex; iSelectIndex--)
{
int iItemIndex = listBox2.SelectedIndices[iSelectIndex];
listBox2.Items.RemoveAt(iItemIndex);
}
listBox2.EndUpdate(); // 화면 갱신을 다시 시작
}
코드 자체는 어려움이 없습니다. Add를 만 번 했고, SelectedItems를 통해 선택된 아이템 개수를 가져와 인덱스 값이 큰 아이템부터 삭제하였습니다.
대신 하이라이트 되어있는 부분 보시면 BeginUpdate와 EndUpdate 함수가 있습니다. 샘플 처럼 10,000개의 아이템을 하나씩 넣다 보면 Windows 앱에서는 아이템이 추가할 때마다 UI를 갱신해야합니다. 그렇게 되면 프로그램이 무의미한 화면 갱신에 동작을 많이 해야합니다. BeginUpdate는 화면 갱신을 일시적으로 중지하는 함수 입니다. BeginUpdate 함수를 사용하고 난 뒤 화면을 갱신을 해서 UI를 다시 그려야 한다면 EndUpdate 함수를 호출하여 화면 갱신을 다시 시작하게 합니다. BeginUpdate 함수를 호출 했으면 EndUpdate 함수를 잊지 말고 호출해야합니다.
실제로 BeginUpdate와 EndUpdate 함수 사용했을 때와 그렇지 않았을 때 비교하면 속도 차이가 꽤 있습니다.
BeginUpdate, EndUpdate 사용 안함
BeginUpdate, EndUpdate 사용
이상으로 간단하게 리스트박스에 대해 알아보았습니다.
github : https://github.com/3001ssw/c_sharp/tree/main/WinForm/List