visual tutorial studio form ejemplos descargar c# .net winforms

c# - tutorial - Cómo actualizar DataSource de un ListBox



winforms c# (5)

Form tiene un Combobox y un ListBox. Cuando se hace clic en el botón "Agregar", quiero agregar el elemento seleccionado desde el ComboBox al ListBox.

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(); } }

Con este ejemplo, el elemento seleccionado se reemplaza con la nueva selección dentro de ListBox. Necesito agregar el artículo a la lista.

¿Qué pasa con mi código?


Alternativamente y probablemente la forma más correcta de implementar esto es usar la ObservableCollection<T> . Está diseñado con el único propósito de implementar 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); } }

Debido a que ObservableCollection<T> implementa INotifyCollectionChanged el enlace de DataSource actualizará automáticamente el ListBox cuando cambien sus datos.


El listbox no detectó que haya cambiado el DataSource . Solo se actualizará cuando Datasource haya cambiado, por lo tanto, primero configure DataSource como nulo:

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

También puede borrar los elementos y luego configurar nuevamente DataSource:

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


Llame a ShowData() cuando el formulario se inicialice para llenar su listbox en la inicialización

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

Método ShowData() , donde se BindingSource , DisplayMember y 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(); } }

En la implementación a continuación cuando un departamento se elimina de la base de datos, el cuadro de lista se actualiza con la colección actual

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(); } }


Sugeriría usar BindingSource ya que actualizaría adecuadamente los controles conectados.

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); } }

Cambiar la fuente de datos de control en vuelo produce resultados extraños en algún momento.


listbox1.DataSource propiedad listbox1.DataSource busca cambios de valores, pero asignando la misma lista todo el tiempo el valor realmente no cambiará.

Puede usar una BindingList<T> , en lugar de su List<T> , para reconocer automáticamente nuevos elementos agregados. Su método ShowData () debe llamarse una vez al inicio.

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); } }