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.