2009-10-19 6 views
1

J'utilise C# et .NET 3.5 et j'ai un GridView que je définis la source de données par programme dans la page code-behind. J'ai des données dans un DataTable, puis en fonction d'une valeur de colonne (isValid boolean) de chaque Row, je crée une nouvelle ligne en utilisant la méthode DataRowView.AddNew() dans 1 des 2 DataViews - dvValid ou dvInvalid. Je ne crée pas un nouveau DataTable.NewRow à ajouter à la table DataView. Ensuite, je lie le GridView à la DataView appropriée.DataView.Count différent DataView.Table.Rows.Count

Un problème est survenu lors du tri de GridView. J'ai un problème avec 1 ligne n'étant pas triée correctement, toutes les autres lignes sont triées correctement. J'ai débogué mon code et trouvé que DataView.Count est 1 de plus que le DataView.Table.Rows.Count même si j'appelle la méthode DataView.Table.AcceptChanges(). Ceci est étrange puisque le dataTable devrait avoir toutes les lignes validées et donc les comptes devraient être les mêmes.

Alors, pourquoi les deux nombres sont-ils différents? Un DataView est un sous-ensemble du DataTable donc il ne devrait pas avoir des lignes égales ou moins que le DataTable. Lorsque je peuple le DataView, dois-je d'abord créer les DataTables plutôt que de créer le DataView directement? En ce moment, je crée directement un DataRowView sans dDataTableRow, est-ce la bonne approche?

Merci pour votre aide.

Extrait de code: C#

...

//get the data as DataTable 
members = GetMemberDataTable(); 

//create views from a new DataTable with no rows 
dvValidMembers = new DataView (CreateMembersDT("ValidMembers")); 
dvInValidMembers = new DataView (CreateMembersDT("InvalidMembers")); 

//iterate thru each row and put into appropriate DataView 
foreach (DataRow memberRow in members.Rows) 
      { 
       if ((bool)memberRow["isValid"]) 
        //Add to valid members Dview 
        member = dvValidMembers.AddNew(); 
       else 
        //add to InValid members Dview 
        member = dvInvalidMembers.AddNew(); 

       member["memberID"] = memberRow["memID"]; 

      } //foreach 

    dvInvalidMembers.Table.AcceptChanges(); 
    dvValidMembers.Table.AcceptChanges(); 

} 

private System.Data.DataTable CreateMembersDT (string tableName) 
    { 
     System.Data.DataTable dtMembers = new System.Data.DataTable(tableName); 

     dtMembers.Columns.Add(new DataColumn("memID", typeof(int))); 

     return dtMembers; 
    } 
+0

La réponse est d'appeler la méthode DataRowView.EndEdit() pour qu'elle soit ensuite ajoutée à la collection DataView.DataTable.Rows et que les deux nombres de lignes correspondent. En outre, il semble que la méthode GridView.Sort() examine la collection DataView.DataTable.Rows lors du tri des lignes. Cependant, je suppose que lors de l'affichage de GridView, il utilise la collection DataView.DataViewRows pour afficher les lignes. C'est la raison pour laquelle, lors du tri, il fallait trier toutes les lignes moins la dernière ligne et en affichant toutes les lignes. – Pritika

+0

Oui, probablement. Notez que vous pouvez trier et filtrer dans la vue. –

Répondre

0

Ce 1 rang qui n'est pas le tri droit, qui pourrait être la dernière ligne?

Je pense que vous manque un DataView.EndEdit():

foreach (DataRow memberRow in members.Rows) 
{ 
    DataView dv; 
    if (...) 
     //Add to valid members Dview 
     dv = dvValidMembers; 
    else 
     dv = dvInvalidMembers; 

    member = dv.Addnew(); 
    member["memberID"] = memberRow["memID"]; 
    dv.EndEdit(); 
} 

Mais je voudrais également noter que vous pouvez probablement utiliser 2 vues avec un filtre sur isValid et alors vous ne devez pointer à la table des membres d'origine.

+0

Merci Henk, c'est la dernière rangée. Laissez-moi essayer votre autre suggestion aussi. – Pritika

Questions connexes