2008-10-30 2 views
1

간단한 사용자 정의 개체 컬렉션에 대한 목록 상자를 데이터 바인딩했습니다. 그런 다음 객체 컬렉션에서 선택한 항목을 제거하는 버튼을 추가했습니다. 문제는 특정 항목이 제거되고 목록 상자에 세로 스크롤 막대가 표시되면 스크롤바가 새로운 위치로 재설정 된 것처럼 보입니다. 실제로 발생하는 것으로 생각되는 것은 컨트롤이 다시 칠해지고있는 것입니다.목록 상자에서 데이터 바인딩 된 항목을 제거하면 새로 고침 문제가 발생합니다.

다음 코드 샘플은 문제를 보여줍니다. 폼에이 코드를 추가하여 세로 스크롤 막대가 나타나는지 확인합니다. 컬렉션의 가운데에있는 항목을 선택하여 스크롤바가 가운데에 놓 이도록하고 제거 버튼을 누릅니다. 컨트롤이 다시 칠해지면 항목과 스크롤 막대가 다른 위치에 있습니다. 목록 상자가 데이터 바인딩되지 않은 항목과 같이 작동하도록하고 싶습니다. 데이터 바인딩을 사용하지 않는 것이 더 좋을까요, 아니면 제가 콘 폴 바인딩을 유지할 수있는 솔루션이 있습니까?

감사합니다.

public partial class Form1 : Form 
{ 
    private BindingList<ItemData> m_bList = new BindingList<ItemData>(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 50; i++) 
     { 
      m_bList.Add(new ItemData("Name " + i.ToString(), i)); 
     } 
     this.listBox1.DisplayMember = "Name"; 
     this.listBox1.DataSource = m_bList; 
    } 

    private void btnRemove_Click(object sender, EventArgs e) 
    { 
     m_bList.Remove(listBox1.SelectedItem as ItemData); 
    } 
} 

public class ItemData 
{ 
    public string Name { get; set; } 
    public int Position { get; set; } 

    public ItemData(string name, int position) 
    { 
     Name = name; 
     Position = position; 
    } 
} 

답변

0

오류를 줄이는 한 가지 방법을 생각해 볼 수 있습니다 (가장 정확한 해결책은 아님). 버튼 클릭 이벤트에 몇 가지를 추가했습니다. 나는 그들이 당신의 요구를 완벽하게 해결할 지 확신하지 못합니다. 왜냐하면 당신이 그 일의 최고 판단이 될 것이기 때문입니다. 그럼에도 불구하고 여기에 당신은갑니다.

private void btnRemove_Click(object sender, EventArgs e) 
    { 
     int s = listBox1.SelectedIndex; 
     m_bList.Remove(listBox1.SelectedItem as ItemData); 
     listBox1.Refresh(); 
     listBox1.SelectedIndex = s; 
    } 
+0

이전 색인이있는 항목을 제거한 후에도 여전히주의해야합니다. 예를 들어, 마지막 항목을 제거하면 IndexOutOfRangeException이 발생합니다. 물론 –

+0

. 그 점을 지적 해 주셔서 감사합니다. 나는 그 문제를 해결할 수 있는지보기 위해 빠른 수정이라고 부르는 것을 제공하려고 노력했습니다. – bioskope

+0

나는 마지막 줄을 다음과 같이 바꿀 것이다 : listBox1.SelectedIndex = (s> = listBox1.Items.Count)? listBox1.Items.Count - 1 : s – tsilb

3

항목을 제거 할 때 목록 상자의 TopIndex 속성을 유지해야합니다. SelectedIndex를 유지해도 스크롤 막대가 점프하지 않습니다. 아래 코드는 내가 원하는 것이라고 생각합니다.

private void btnRemove_Click(object sender,EventArgs e) 
    { 
     int topIndex = listBox1.TopIndex; 

     m_bList.Remove(listBox1.SelectedItem as ItemData); 

     if(listBox1.Items.Count>topIndex) 
      listBox1.TopIndex = topIndex; 
    } 
관련 문제