2009-01-31 6 views
7

Lorsque l'application est exécutée, le DataGridView est lié à DataTable. Plus tard, j'ajoute plus de colonnes au DataTable par programme et cela se reflète dans les données sous-jacentes - c'est-à-dire que la colonne Ordinals est comme il se doit. Cependant, ceci n'est pas reflété dans le DataGridView. Au lieu de cela, les colonnes sont ajoutées à l'ensemble généré à l'origine.La modification de l'ordre des colonnes dans DataTable lié à DataGridView ne reflète pas dans la vue

Cet exemple démontre,

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public DataTable data = new DataTable(); 

    private void button1_Click(object sender, EventArgs e) 
    { 

     this.dataGridView1.DataSource = data; 
     for (int i = 0; i < 5; i++) 
     { 
      this.data.Columns.Add(i.ToString()); 
     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     DataColumn foo = new DataColumn(); 
     this.data.Columns.Add(foo); 
     foo.SetOrdinal(0); 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     foreach (DataColumn tmpCol in this.data.Columns) 
     { 
      Console.WriteLine("{0} : {1}", tmpCol.ColumnName, tmpCol.Ordinal); 
     } 
    } 
} 

bouton 1 génère les colonnes, le bouton 2 ajoute une colonne et définit la ordinal à 0 de sorte qu'il doit être le premier dans la grille, le bouton 3 affiche les ordinaux des colonnes et montre qu'ils sont comment ils devraient être dans le DataTable.

Répondre

9

C'est ainsi que fonctionne DataGridView; Avec les colonnes auto-générer activées, les colonnes supplémentaires (non mappées) sont ajoutées à la fin. Vous pouvez dissocier et re-lier pour le réparer; définir le DataSource à null et à la table:

this.dataGridView1.DataSource = null; 
this.dataGridView1.Columns.Clear(); 
this.dataGridView1.DataSource = data; 
1

J'ai eu un problème similaire et a résolu le problème avec la propriété DataGridViewColumn.DisplayIndex.

dgvData.Columns["COLUMN_NAME"].DisplayIndex = 0; // will move your custom column to first position