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;
}
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
Oui, probablement. Notez que vous pouvez trier et filtrer dans la vue. –