2010-11-30 3 views
3

J'ai un datatable non vide. Quelle est la meilleure façon d'ajouter une autre colonne qui a une numérotation séquentielle à partir de 1.La meilleure façon d'ajouter une nouvelle colonne avec une numérotation séquentielle dans une table de données existante

J'ai essayé le code suivant. Mais n'a pas fonctionné.

DataColumn dc = new DataColumn("Col1"); 
dc.AutoIncrement = true; 
dc.AutoIncrementSeed = 1; 
dc.AutoIncrementStep = 1;  
dc.DataType = typeof(Int32); 
dt.Columns.Add(dc); 

Est-ce que la définition d'une expression quelconque sera utile dans ce scénario?

Merci à l'avance

+0

Ajouté le code modifié, veuillez vérifier. – TalentTuner

Répondre

5

Je pense que vous pourriez y parvenir en utilisant une 2e table de données « d'aide » qui contiendrait juste un champ incrémentation automatique et alors vous remplissez/fusionner avec les données existantes, quelque chose comme ceci:

DataTable dtIncremented = new DataTable(dt.TableName); 
DataColumn dc   = new DataColumn("Col1"); 
dc.AutoIncrement   = true; 
dc.AutoIncrementSeed  = 1; 
dc.AutoIncrementStep  = 1; 
dc.DataType    = typeof(Int32);  
dtIncremented.Columns.Add(dc); 

dtIncremented.BeginLoadData(); 

DataTableReader dtReader = new DataTableReader(dt); 
dtIncremented.Load(dtReader); 

dtIncremented.EndLoadData(); 

Et alors vous suffit de retourner la table dtIncremented INSTE annonce de la dt originale. Pas une solution élégante mais devrait fonctionner.

+0

Merci Son travail – Ananth

0

Vous devez construire un tout nouveau datatable pour cela et manuellement copie en profondeur chaque ligne un par un à partir de l'ancienne table à la nouvelle. Pardon.

+0

Pas besoin: vous pouvez gérer l'événement collectionchanged – TalentTuner

1

ci-dessous le code a fonctionné pour moi

code est édité

 // Added temp rows so that this solution can mimic actual requirement 

     DataTable dt = new DataTable(); 
     DataColumn dc1 = new DataColumn("Col"); 
     dt.Columns.Add(dc1); 

     for(int i=0;i<10;i++) 
     { 
      DataRow dr = dt.NewRow(); 
      dr["Col"] = i.ToString(); 
      dt.Rows.Add(dr); 
     } 


     // Added new column with Autoincrement, 

     DataColumn dc = new DataColumn("Col1"); 
     dc.AutoIncrement = true; 
     dc.AutoIncrementSeed = 1; 
     dc.DataType = typeof(Int32); 

     // Handeled CollectionChanged event 

     dt.Columns.CollectionChanged += new CollectionChangeEventHandler(Columns_CollectionChanged); 
     dt.Columns.Add(dc); 

     // After column added demostratation 

     DataRow dr1 = dt.NewRow(); 
      dt.Rows.Add(dr1); 



    void Columns_CollectionChanged(object sender, CollectionChangeEventArgs e) 
    { 
     DataColumn dc = (e.Element as DataColumn); 
     if (dc != null && dc.AutoIncrement) 
     { 
      long i = dc.AutoIncrementSeed; 
      foreach (DataRow drow in dc.Table.Rows) 
      { 
       drow[dc] = i; 
       i++; 
      } 
     } 
    } 
+0

L'OP a spécifié que le DataTable contient déjà des données. –

+0

@ Sauradb..Merci mais cela ajoute une nouvelle rangée. Les lignes existantes sont vides pour la colonne nouvellement ajoutée. Nous devons avoir une numérotation séquentielle pour les lignes existantes. – Ananth

+0

@Ananth: Ajout d'un nouveau code, s'il vous plaît vérifier – TalentTuner

Questions connexes