2010-06-16 4 views
1

ListBox의 SelectedItem 데이터를 속성에 바인딩하려고합니다. 다음 코드는 예입니다.BindingNavigator가있는 상태에서 ListBox의 SelectedItem 바인딩

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 

namespace BindingFailure 
{ 
static class Program 
{ 
    class OuterObject 
    { 
    public string selected { get; set; } 
    public List<string> strings { get; set; } 
    } 

    public static void Main() 
    { 
    List<OuterObject> objs = new List<OuterObject>() 
    { 
    new OuterObject(), new OuterObject() 
    }; 
    objs[0].strings = new List<string> { "one", "two", "three" }; 
    objs[1].strings = new List<string> { "four", "five", "six" }; 

    Form form = new Form(); 

    BindingSource obs = new BindingSource(objs, null), 
    ibs = new BindingSource(obs, "strings"); 
    BindingNavigator nav = new BindingNavigator(obs); 
    ListBox lbox = new ListBox(); 
    lbox.DataSource = ibs; 
    lbox.DataBindings.Add(new Binding("SelectedItem", obs, "selected")); 

    form.Controls.Add(nav); 
    form.Controls.Add(lbox); 
    lbox.Location = new System.Drawing.Point(30, 30); 

    Application.Run(form); 
    } 
} 
} 

항목을 선택하면 앞으로 이동하고 항목을 선택한 다음 끝내면 예상대로 작동합니다. 그러나 네비게이터를 사용하여 두 외부 물체간에 앞뒤로 전환하면 선택한 항목이 잘못된 값으로 덮어 쓰여있는 것처럼 보입니다. BindingNavigator가 요소로 이동할 때마다 ListBox는 컬렉션의 첫 번째 항목으로 이동해야하므로 SelectedItem에 바인딩 된 변수에 있던 모든 값을 덮어 쓰는 것으로 나타납니다.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 미리 감사드립니다.

편집 : 다음은 디버그 이진을 포함하여 예제 프로젝트의 아카이브입니다.

http://www.mediafire.com/?dzmqmz0mynj

편집 : 여기 허용 대답에 따라 도우미 기능은 다음과 같습니다

 public static void Bind(ListControl list, BindingSource outersource, string dataMember) 
     { 
      Binding bindSel = new Binding("SelectedItem", outersource, dataMember); 
      list.DataBindings.Add(bindSel); 

      outersource.CurrentChanged += delegate 
      { 
       list.BeginInvoke(new MethodInvoker(bindSel.ReadValue)); 
      }; 
     } 
+0

나는 그것을 재현 할 수 없다. 그것은 목록 상자와 탐색기 (새로운 단추 및 제거 단추 제외)로 무엇을하려고 하든지 관계없이 잘 작동합니다. – Yegor

+0

아마 사용중인 .NET 버전일까요? 3.5를 사용 중입니다 ... – Reinderien

+0

제공 한 코드로 문제를 복제 할 수 없습니다. 닷넷 3.5와 C#. 새로 만들기 및 제거 버튼이 작동하지 않지만, 탐색 버튼의 콤보를 사용하여 목록이 잘 채워진 것처럼 보입니다. 오류를 재현하는 데 도움이되는 추가 단계를 나열하거나 어딘가에 파일 저장소에 프로젝트를 업로드 할 수 있습니까? – Caladain

답변

3

목록 상자가 업데이트되기 전에 selectedItem가 업데이트가 발생하기 때문에이 발생합니다. 따라서 첫 번째 단계에서 목록 상자는 이러한 레코드가 없으므로 다른 양식 레코드의 값을 "수락"할 수 없으며 목록 상자 항목을 다시 채운 후에는 선택 항목을 복원 할 수 없습니다.

해결 방법은 현재 양식 레코드가 변경된 후 SelectedItem 바인딩을 강제로 다시 적용하는 것입니다. 우리가 (목록 상자가 다시 채워 후 BeginInvoke 바인딩을 적용하는 것이 필수적이다 통지) 바인딩을 다시 적용 할 필요가보다

//lbox.DataBindings.Add(new Binding("SelectedIndex", obs, "Index")); 
var selItemBinding = new Binding("SelectedItem", obs, "selected"); 
lbox.DataBindings.Add(selItemBinding); 

: 처음에 우리는 바인딩의 이름을 지정

obs.CurrentChanged += delegate 
{ 
    form.BeginInvoke(new MethodInvoker(selItemBinding.ReadValue)); 
}; 

또한 간단한 도우미 메서드를 만들 수있는 한 번의 호출로이 모든 트릭을 수행 할 것입니다.

+0

완벽하게 작동합니다. 고맙습니다. – Reinderien

관련 문제