Manière correcte d’avoir un DataGridView reflétant visuellement les modifications apscopes à son DataSource

Disons qu’un DataGridView a sa propriété DataSource définie sur une instance DataView .

 DataGridView dgv; DataTable dt; // ... dt gets populated. DataView dv = dt.DefaultView; dgv.DataSource = dv; // ... dt gets modified // The DataGridView needs to update to show these changes visually // What goes here? 

Je sais que vous pouvez définir dgv.DataSource sur null , puis revenir à dv . Mais cela semble assez étrange. Je suis sûr qu’il y a deux autres façons aussi. Mais quelle est la bonne façon officielle de faire cela?

La méthode correcte consiste pour la source de données à implémenter IBindingList , à retourner true pour SupportsChangeNotification et à émettre des événements ListChanged . Autant que je sache, un DataView fait cela …

Je suis à peu près sûr que si DataGridView est lié à DefaultView d’un DataTable et que la table est modifiée, les modifications sont automatiquement reflétées dans DataGridView. Avez-vous essayé cela et rencontrez des problèmes? Publiez le code que vous avez qui met à jour le DataTable, peut-être que quelque chose d’autre est faux. En fait, voici un exemple d’application que je viens d’écrire:

 public partial class Form1 : Form { private DataTable table; public Form1() { InitializeComponent(); table = new DataTable(); this.LoadUpDGV(); } private void LoadUpDGV() { table.Columns.Add("Name"); table.Columns.Add("Age", typeof(int)); table.Rows.Add("Alex", 27); table.Rows.Add("Jack", 65); table.Rows.Add("Bill", 22); table.Rows.Add("Mike", 36); table.Rows.Add("Joe", 12); table.Rows.Add("Michelle", 43); table.Rows.Add("Dianne", 67); this.dataGridView1.DataSource = table.DefaultView; } private void button1_Click(object sender, EventArgs e) { table.Rows.Add("Jake", 95); } } 

Fondamentalement, lorsque le formulaire est chargé, il ne fait que renseigner la table avec des noms et des âges. Ensuite, cela lie cela au DGV. En cliquant sur un bouton, il ajoute une autre ligne au DataTable lui-même. Je l’ai testée et, bien sûr, elle est apparue dans la grid sans aucun problème.