2013-07-12 2 views
33

Форма имеет один Combobox и один ListBox. Когда нажимается кнопка «Добавить», я хочу добавить выбранный элемент из ComboBox в ListBox.Как обновить DataSource ListBox в C# WinForms

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 свойство выглядит для изменения значений а назначая тот же список все время, когда значение не изменится.

Вы можете использовать BindingList<T> вместо List<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

просто добавьте 'listBox1.DataSource = null;' в качестве первой строки вашего метода ShowData() ' – NoviceProgrammer

+2

, спасибо за это, я потратил час, пытаясь понять, почему мой список не отображает мои предметы должным образом, даже после следуя приведенному ниже руководству Майкрософт 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 при редактировании элементов в нем без необходимости излишнего испорчения позиции прокрутки. – 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. Это будет только обновить, когда Datasource изменилось, поэтому установите DataSource обнулить первый:

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

Можно также очистить элементы затем установите DataSource снова:

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

Элемент коллекции не может быть изменен при установке свойства DataSource. Таким образом, второй пример не будет работать. –

+3

** Предупреждающее примечание: ** Установка 'listBox1.DataSource = null' * также * устанавливает' DisplayMember' в пустую строку (но не 'ValueMember'). (Обнаружено это в отладчике с .NET 4.0 WinForms.) Итак, если вы используете 'DisplayMember' и' ValueMember', обязательно переназначьте «DisplayMember» после установки «DataSource» на «null». – 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 источник данных связывания будет автоматически обновлять ListBox всякий раз, когда ваши данные изменения.

0

Вызов ShowData() когда форма инициализирует для заполнения вашего ListBox при инициализации

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

ShowData() метод, где BindingSource, DisplayMember и ValueMember устанавливаются

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

В реализации ниже, когда отдел удаляется из базы данных обновляется список с текущей коллекцией

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(); 
     } 
    } 
Смежные вопросы