2010-08-17 3 views
0

Hé les gars, j'ai un GridView ASP.NET lié à un DataView qui contient un DataTable. Je n'utilise pas un DataAdapter.Mise à jour d'un DataTable?

Je veux mettre à jour une ligne dans mon DataTable, donc je fais ceci:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    DataView dv = (DataView)Session["My_DataTable"]; 
    DataTable dt = dv.Table; 
    int rowIndex = GridView1.Rows[e.RowIndex]; 
    dt.Rows[rowIndex]["FirstName"] = thenewfirstname; 
    dt.Rows[rowIndex]["MI"] = thenewmi; 
    dt.Rows[rowIndex]["LastName"] =thenewlastname; 
    Session["My_DataTable"] = dv; 
    //Reset the edit index. 
    GridView1.EditIndex = -1; 

    //Bind data to the GridView control. 
    GridView1.DataSource = Session["My_DataTable"]; 
    GridView1.DataBind(); 
} 

Le DataView sous-jacente/DataTable est modifiée correctement, mais le GridView contient à la fois l'ancienne ligne avant le montage, et le nouveau ligne après l'édition (c'est-à-dire, il ajoute une ligne supplémentaire avec les nouvelles modifications!).

Par exemple, si nous avons:

... 
Sammy S Samerson 
... 

et le changement à la Sammy E Samerson gridview dit:

... 
Sammy S Samerson 
Sammy E Samerson 
... 

Comment puis-je résoudre ce problème, qu'est-ce que je fait de mal?

+0

Tu es sûr que Sammy E ne pas écraser une autre entrée? ou votre nombre total de lignes est-il également augmenté? – Jeroen

+0

Je suis sûr qu'aucune entrée n'a été écrasée, et le nombre de lignes est augmenté de 1. –

Répondre

1

Il se passait beaucoup de choses étranges. L'essentiel de toutes les mauvaises choses était le DataView - parce que les choses étaient en cours de réorganisation, l'index de la GridView, et l'index du DataTable dans le DataView ne correspondaient pas. Le DataTable a dû être bouclé jusqu'à ce que l'enregistrement correct nouvellement édité ait été trouvé.

1

Avez-vous vérifié l'index des lignes de la ligne d'édition? int rowIndex = GridView1.Rows [e.RowIndex]; vous pouvez directement utiliser le e.RowIndex.

Ma suggestion est d'obtenir la ligne en utilisant n'importe quel champ clé de la table.

par exemple

DataRow[] customerRow = 
dataSet1.Tables["Customers"].Select("CustomerID = 'ALFKI'"); 

customerRow[0]["CompanyName"] = "Updated Company Name"; 
customerRow[0]["City"] = "Seattle"; 

Vous pouvez obtenir les valeurs de ligne en utilisant la position cellulaire. Ou utiliser DataKeyNames par exemple:

string courseid = GridView1.Rows[e.RowIndex].Cells[3].Text; 
Questions connexes