본문 바로가기
개발언어/C#

[C#] 리스트뷰(listView)에서 원하는 항목의 인덱스(순서)를 바꾸는 방법

by 창용이랑 2022. 8. 22.
728x90

 

 

_index_  | column1 | column2 | columns3 |
----------------------------------------------------------
      0        |  name1   |      tel1     |  address1 |
      1        |  name2   |      tel2     |  address2 |
      2        |  name3   |      tel3     |  address3 |
      3        |  name4   |      tel4     |  address4 |
      4        |  name5   |      tel5     |  address5 |
      5        |  name6   |      tel6     |  address6 |

예를 들어 위와 같은 리스트뷰컨트롤이 있다고 할 때......드랙드랍이건, 키이벤트건 어떤 이벤트를 이용하던간에

인덱스 3에 있는 ListViewItem 형식의 항목을 다른 위치로 바꾸는 방법을 알고 싶습니다.

쉽게 말해 항목의 순서를 바꾸는 방법을 알고 싶습니다. ListBox 는 쉬웠는데....이건 잘 안되네요...

참고로 저는 일단 마우스로 항목을 선택하여 키보드의 Up 키를 누르면 순서가 하나씩 빨라 지게끔 만드려고 했는데...

예를 들어 3번을 선택했을 경우, 3번을 ListViewItem 형식의 temp 라는 변수에 임시 저장하고 선택한 바로 앞의 항목을

ListViewItem 형식의 temp2에 저장한 후 둘을 지웠습니다. 물론 선택한 항목의 인덱스도 임시로 tempIndex 라는 int형 변수에 

저장했구요... 둘을 지운 후에 원래 있던 둘의 index를 서로 맞바꿔  insert 했습니다. 그런데 같은 인덱스에 두개의 ListViewItem이 

못들어간다는군요.. 이로 미루어 보아 ListBox에서와는 달리 지움과 동시에 뒤에 있던 항목의 인덱스가 하나씩 앞당겨지나 봅니다.

정확히는 모르겠구요...아무리 생각해도 그렇게 만들지는 않았을 것 같은데....질문이 너무 길어도 한번 읽어보시고 답변 

부탁드리겠습니다.

 

Clone() 메소드로 객체를 복사한 다음 삽입을 해야 합니다.

private void MoveItem(int index, ListViewItem oItem)
{
    // 제거
    listView1.SelectedItems[0].Remove();

    // 추가
    listView1.Items.Insert(index, oItem);

    oItem.Selected = true;
    oItem.Focused = true;

    listView1.Focus();
}

private void btnUp_Click(object sender, System.EventArgs e)
{
    if (listView1.SelectedItems.Count > 0)
    {
    ListViewItem oItem = (ListViewItem)listView1.SelectedItems[0].Clone();
    int index = listView1.SelectedItems[0].Index;

    if (index > 0)
    index--;

    MoveItem(index, oItem);
    }
}

private void btnDown_Click(object sender, System.EventArgs e)
{
    if (listView1.SelectedItems.Count > 0)
    {
    ListViewItem oItem = (ListViewItem)listView1.SelectedItems[0].Clone();
    int index = listView1.SelectedItems[0].Index;

    if (index < listView1.Items.Count-1)
    index++;

    MoveItem(index, oItem);
    }
}

 

https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=doghole&logNo=100100082033

 

리스트뷰(listView)에서 원하는 항목의 인덱스(순서)를 바꾸는 방법

_index_ | column1 | column2 | columns3 |---------------------------------------------------------- 0...

blog.naver.com

 

https://blog.naver.com/nikeruga/60145719346

 

리스트뷰(listView)에서 원하는 항목의 인덱스(순서)를 바꾸는 방법

Clone() 메소드로 객체를 복사한 다음 삽입을 해야 합니다. private void MoveItem(int index, ListVi...

blog.naver.com