리스트뷰 다중 선택을 했을 때 체크박스가 하나 누락되는 현상이 나온다.

이는 팀장님께서 원인을 알려주셨는데, 

 "아이템을 클릭했을때 체크박스가 선택되는 거랑(선택 시 true), 쉬프트 눌러서 다중 선택 했을때 체크박스가 선택되는거(앞서 체킹되었던 true 에서 false 로 바뀜)랑 이중으로 선택이 되었기 때문에 체크박스가 마지막 클릭하는 하나가 누락되는 현상이 벌어지는 것"이라고 알려주셨다..


클릭 이벤트를 직접 들어가서 오버로딩을 하든지, 코드를 바꾸든지 해야될 것 같다고 생각했지만.. 어떻게하는건지 난 씨샵 초보이기 때문에...

그냥 클릭을 했을때 체크가 되는 현상을 무효화 시키고, 다시 원하는 부분만 체크 시키는 방법으로 생각을 바꿨다.


클릭 했을 때 체크가 되는 현상을 무효화 시키는 방법은 다른 글에 기재해놓았다


여기 <<  로 들어가서 확인해보면 된다!


위와 같이 선택시 체킹되는것을 무효화 한 다음 다음과 같이 작성하면 된다.


리스트뷰의 이벤트 속성인 ItemChecked를 이용했다.

ItemChecked는 아이템이 체킹될때마다 발생하는 이벤트이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e)
{
    // 멀티셀렉을 했을 때 체킹 상태를 저장하기 위해 사용. 나머지들도 처음 체킹한걸로 바꿔야하니까..
    bool isfirst = true
   
    // 처음 체킹한 상태를 나머지들에게도 적용하기 위함
    bool listViewCurrentCheck = false
 
    int cnt = listView1.Items.Count;
    ListViewItem lvi = new ListViewItem();
    for (int i = 0; i < cnt; i++)
    {
        lvi = listView1.Items[i];
    
       //멀티셀렉한 부분이 아닌 곳에서 단일 체킹을 하게 되면, 멀티셀렉한 부분이 해제되도록 함
        if(e.Item.Selected == false)
        {
            lvi.Selected = false
        }
        else
        {
            if (lvi.Selected == true)
            {
            // 체킹한 곳의 상태를 저장 (지금상태가 true 인지 false인지)
            if (isfirst == true
            {
                lvi.Checked = e.Item.Checked;
                listViewCurrentCheck = lvi.Checked;
                isfirst = false;
            }
 
             //위의 저장을 다른 멀티 셀렉된 아이템들에게도 적용
            else 
            {
                lvi.Checked = listViewCurrentCheck;
            }
        }
    
    }
                
}
cs


ㅠㅠ 이거 생각한다고 하루를 삽질했따....삽삽삽삽


MultiSelecte CheckBox Check , 체크박스 하나 누락 , 리스트뷰 체크박스 버그 , 리스트뷰 체크박스 하나 선택이 안됌

+ Recent posts