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