2013-07-12 3 views
33

폼에는 하나의 콤보 박스와 하나의 ListBox가 있습니다. "추가"버튼을 클릭하면 ComboBox에서 선택한 항목을 ListBox에 추가하려고합니다.C# WinForms에서 ListBox의 DataSource를 새로 고치는 방법

public partial class MyForm:Form 
{ 
    List<MyData> data = new List<MyData>(); 
    private void ShowData() 
    { 
     listBox1.DataSource = data; 
     listBox1.DisplayMember = "Name"; 
     listBox1.ValueMember = "Id"; 
    } 

    private void buttonAddData_Click(object sender, EventArgs e) 
    { 
     var selection = (MyData)comboBox1.SelectedItem; 
     data.Add(selection); 
     ShowData(); 
    } 

} 

이 예제에서는 선택한 항목이 ListBox 내의 새로운 선택으로 바뀝니다. 항목을 목록에 추가해야합니다.

내 코드가 잘못되었습니다.

감사합니다.

+0

'ShowData()'와'LoadData()'사이에 차이점이 있습니까, 아니면 실수입니까? – dwonisch

+0

LoadData()에 대한 코드? 이 목록 상자에 대해 게시 한 내용이 없습니다. –

+0

에 문제가 있습니다. ShowData()입니다. 죄송합니다. 좋은 눈이었습니다. – panjo

답변

47

listbox1.DataSource 속성 값이 변경뿐만으로 보이는 그것은 단지 변경되면 Datasource 새로 고침, 그래서 첫 번째 null로 DataSource 설정 항상 동일한 목록을 지정하면 값이 실제로 변경되지 않습니다.

List<T> 대신 BindingList<T>을 사용하여 추가 된 새 항목을 자동으로 인식 할 수 있습니다. ShowData() 메서드는 시작시 한 번 호출해야합니다.

public partial class MyForm:Form 
{ 

    public MyForm(){ 
     InitializeComponent(); 
     ShowData(); 
    } 

    BindingList<MyData> data = new BindingList<MyData>(); 

    private void ShowData() 
    { 
     listBox1.DataSource = data; 
     listBox1.DisplayMember = "Name"; 
     listBox1.ValueMember = "Id"; 
    } 

    private void buttonAddData_Click(object sender, EventArgs e) 
    { 
     var selection = (MyData)comboBox1.SelectedItem; 
     data.Add(selection); 
    } 
} 
+3

'ShowData()'메소드의 첫번째 줄에'listBox1.DataSource = null;'을 추가하십시오. – NoviceProgrammer

+2

이것에 대해 고마워요. 왜 목록 상자가 내 항목을 제대로 표시하지 못하는지를 알아 내려고 한 시간을 보냈습니다. 다음 Microsoft의 튜토리얼을 자세히 읽어보십시오. http://msdn.microsoft.com/en-us/library/system.windows.forms.listcontrol.datasource.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet- 2 – Aralox

+0

오, 이거 예쁜데. ListBox를 불필요하게 스크롤 위치를 엉망으로 만들지 않고 항목을 편집 할 때 ListBox를 새로 고치는 데 사용할 수 있습니다. – Nyerguds

19

연결된 컨트롤을 올바르게 업데이트하므로 BindingSource을 사용하는 것이 좋습니다. 즉시

public partial class MyForm : Form 
{ 
    List<MyData> data = new List<MyData>(); 
    BindingSource bs = new BindingSource(); 

    public MyForm() 
    { 
     IntializeComponents(); 
     bs.DataSource = data; 

     listBox1.DisplayMember = "Name"; 
     listBox1.ValueMember = "Id"; 
     listBox1.DataSource = bs; 
    } 

    private void buttonAddData_Click(object sender, EventArgs e) 
    { 
     var selection = (MyData)comboBox1.SelectedItem; 
     data.Add(selection); 

     bs.ResetBindings(false); 
    } 
} 

변경 제어 데이터 소스는 가끔 이상한 결과를 생성합니다.

12

목록 상자에서 DataSource을 변경했음을 감지하지 못했습니다.

listBox1.DataSource = null; 
listBox1.DataSource = data; 

또한 다음 항목을 취소 할 수 다시 데이터 소스를 설정합니다 :

listBox1.Items.Clear(); 
listBox1.DataSource = data; 
+6

DataSource 속성을 설정하면 Items 컬렉션을 수정할 수 없습니다. 따라서 두 번째 예제는 작동하지 않습니다. –

+3

**주의 사항 : **''ListBox1.DataSource = null' 또한 * 설정은 빈 문자열 ('ValueMember'가 아닌)에'DisplayMember'을 설정합니다. (.NET 4.0 WinForms를 사용하여 디버거에서이를 발견했습니다.) 따라서 'DisplayMember' 및'ValueMember'를 사용하는 경우 'DataSource'를'null '로 설정 한 후 반드시 DisplayMember를 다시 할당해야합니다. – DavidRR

3

는 다른 방법 및이를 구현하기 위해 아마도 가장 올바른 방법 제공된 ObservableCollection<T>을 사용하는 것입니다. INotifyCollectionChanged을 구현하는 유일한 목적으로 설계되었습니다.

public partial class MyForm : Form 
{ 
    ObservableCollection<MyData> data = new ObservableCollection<MyData>(); 

    public MyForm() 
    { 
     listBox1.DataSource = data; 
     listBox1.DisplayMember = "Name"; 
     listBox1.ValueMember = "Id"; 
    } 

    private void buttonAddData_Click(object sender, EventArgs e) 
    { 
     var selection = (MyData)comboBox1.SelectedItem; 
     data.Add(selection); 
    } 
} 

것은 ObservableCollection<T> 구현 INotifyCollectionChanged 데이터 소스가 자동으로 때마다 데이터가 변경리스트 박스를 업데이트합니다 바인딩 때문입니다.

0

전화 ShowData() 양식 초기화에 BindingSource, DisplayMemberValueMember이 부서가 삭제 될 때 아래의 구현에

private void ShowData() 
      { 
       using (var uow = new UnitOfWork(new SellContext())) 
       { 
        listBox1.DataSource = uow.Departments.GetAll().ToList(); 
        listBox1.DisplayMember = "DepartmentName"; 
        listBox1.ValueMember = "DepartmentId"; 
        //listBox1.Invalidate();  
       } 
      } 

을 설정

public Department() 
     { 
      InitializeComponent(); 
      ShowData(); 
     } 

ShowData() 방법, 당신의 목록 상자를 채우는 초기화 할 때 데이터베이스에서 목록 상자가 현재 컬렉션으로 새로 고침

private void button1_Click(object sender, EventArgs e) 
    { 
     try { 
      using (var uow = new UnitOfWork(new SellContext())) 
      { 
       int count = uow.Departments.FindDepartmentByName(txtDeptName.Text.ToString()); 
       if (count>0) 
       { 
        MessageBox.Show("This Department Already Exists", "SellRight", MessageBoxButtons.OK, MessageBoxIcon.Hand); 
       } 

       else 
       { 
        department dept = new department(); 
        dept.DepartmentName = txtDeptName.Text.ToString(); 
        uow.Departments.Create(dept); 
        if (uow.Complete() > 0) 
        {   
         MessageBox.Show("New Department Created", "SellRight", MessageBoxButtons.OK, MessageBoxIcon.Information); 
         txtDeptName.Text = ""; 
         ShowData();  
        } 
        else 
        { 
         MessageBox.Show("Unable to add Department", "SellRight", MessageBoxButtons.OK, MessageBoxIcon.Error); 
         txtDeptName.Text = ""; 
         ShowData(); 
        } 
       } 
      }        
     } 
     catch(Exception ex) 
     { 
      ex.ToString(); 
     } 
    } 
관련 문제