web-dev-qa-db-fra.com

Comment actualiser la source de données d'un ListBox

La forme a une Combobox et une ListBox. Lorsque le bouton "Ajouter" est cliqué, je souhaite ajouter l'élément sélectionné de la zone de liste déroulante à la zone de liste.

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

Dans cet exemple, l'élément sélectionné est remplacé par la nouvelle sélection dans ListBox. Je dois ajouter l'article à la liste.

Quel est le problème avec mon code?

43
panjo

listbox1.DataSource _ cherche des changements de valeur, mais en affectant la même liste tout le temps, la valeur ne changera pas vraiment.

Vous pouvez utiliser un BindingList<T>, au lieu de votre List<T>, pour reconnaître automatiquement les nouveaux éléments ajoutés. Votre méthode ShowData () doit être appelée une fois au démarrage.

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

Je suggérerais d’utiliser BindingSource pour mettre à jour correctement les contrôles connectés.

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

Changer de source de données de contrôles à la volée produit parfois des résultats étranges.

26
gzaxx

La listbox n'a pas détecté que vous avez changé le DataSource. Il ne s'actualisera que lorsque Datasource aura changé. Par conséquent, définissez DataSource sur null:

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

Vous pouvez également effacer les éléments, puis redéfinir DataSource:

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

Cette solution n’a peut-être pas les meilleures performances, mais après de nombreux essais et quelques heures, c’est ce qui a fonctionné pour moi:

Cette ligne a été exécutée sur le constructeur de formulaire:

listBox1.DataSource = myData;

This lines were executed after the information was modified:
listBox1.DataSource = new List<Movil>();
listBox1.DataSource = myData;

J'espère que ça aide!

0

Alternativement, et probablement la manière la plus correcte de mettre cela en œuvre est d’utiliser le fourni ObservableCollection<T> . Il est conçu dans le seul but de mettre en œuvre 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);
    }
}

Parce que ObservableCollection<T> implémente INotifyCollectionChanged, la liaison DataSource mettra automatiquement à jour le ListBox à chaque modification de vos données.

0
jduncanator

Appelez ShowData() lorsque le formulaire s'initialise pour renseigner votre zone de liste lors de l'initialisation.

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

ShowData() Méthode, où BindingSource, DisplayMember et ValueMember sont définis

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

Dans l'implémentation ci-dessous, lorsqu'un département est supprimé de la base de données, la zone de liste est actualisée avec la collection actuelle.

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