728x90

listView 와 textBox 을 연동하여 textBox 에서 값이 변화하면 자동으로 listView 의 해당 Line 에 변경이 발생하도록 처리하려고 했는데, 로직을 잘못 생각하여 버그가 계속 발생하는 원인을 못찾다가 겨우 해결했다.

코드를 작성할 때 Focused 가 되었을 경우에만 해당 이벤트가 발생하도록 코드를 해야한다는 걸 알아냈다.

구글링 검색해서 그런 부분까지 자세히 설명이 안되어 있다보니 오류가 발생했다.

물론 구글에 나오는 자료는 자료가 발생하는 상황이 단순한 상황이라 답변해주는 코드가 정답일 수도 있다.

하지만 내가 작성하는 코드는 다른 부분까지 엮여있어서인지 문제가 발생했고, 이 문제는 심각한 문제로 이어졌다.

물론 textBox_TextChanged 이벤트 이용을 포기하면 간단하게 해결될 수 있다. 하지만 이용자의 편의성 측면에서 매우 불편해진다.


C# listView 에서 포커스가 되지 않도록 처리하는 방법

if (listView1.SelectedItems.Count != 0)
{
    listView1.SelectedItems[0].Selected = false;
}
를 해당 이벤트에 추가해주면 된다.


listView 와 연계된 텍스트박스에서 포커스 처리하는 방법

텍스트박스에서 Alt + 화살표 방향키를 누르면 listView 선택된 행이 위아래로 변경되면서 변경된 값을 텍스트박스에 자동연동하여 처리하는 코드이다.


private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Alt && e.KeyCode == Keys.Down)  // Alt + 아래방향화살표키를 누르면
    {
        int index = listView1.FocusedItem.Index;
        listView_FocusedLIneChange(listView1, index + 1);
    }
    if (e.Alt && e.KeyCode == Keys.Up)  // Alt + 윗방향화살표키를 누르면
    {
        int index = listView1.FocusedItem.Index;
        listView_FocusedLineChange(listView1, index - 1);
    }
}

private void listView_FocusedLineChange(ListView LV, int index)
{
    if (index < 0 || index >= LV.Items.Count || LV.Items.Count == 0) return;
    LV.SelectedItems.Clear();
    LV.Items[index].Selected = true;
    LV.Items[index].EnsureVisible();
    LV.Items[index].Focused = true;
    LV.Focus();
    listView_Focused();  // User Make 함수
    LV.Items[index].BackColor = SystemColors.Highlight;
    if (LV == listView1)
    {
        textBox1.Focus();
        textBox1.SelectionStart = textBox1.Text.Length; // 마지막을 선택
        textBox1.ScrollToCaret(); // 선택된 위치에 스크롤을 움직인다
    }
    else if (LV == listView2)
    {
        textBox2.Focus();
        textBox2.SelectionStart = textBox2.Text.Length;
        textBox2.ScrollToCaret();
    }
}


블로그 이미지

Link2Me

,