Pourquoi est-DataItem null pour un GridView ligne “null” lorsque vous essayez d'enregistrer les modifications?
Donc j'ai un GridView sur ma page web. Il est lié aux données, de sorte que lors de la RowDataBound événement de ce code fonctionne parfaitement bien:
protected void myGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
TimecardApproval shift = (TimecardApproval)e.Row.DataItem;
}
}
La touche "shift" variable dispose de toutes les données dont j'ai besoin, fonctionne très bien. Mais ensuite il y a ce code pour enregistrer les données:
protected void btnSubmitApprovals_Click(object sender, ImageClickEventArgs e)
{
foreach (GridViewRow item in gvTimeCards.Rows)
{
TimecardApproval shift = (TimecardApproval)item.DataItem;
//code to update the row
}
}
DataItem est nul! Pourquoi? Étant donné que le champ est là, il semble étrange que c'est nul. Dois-je être en boucle sur quelque chose d'autre?
DataItem
est définie lors de la liaison de données. Sur les publications, il est toujours null jusqu'à ce que vous DataBind
le contrôle GridView à nouveau. Notez que toutes les variables sont éliminés à la fin de la page de cycle de vie. Qu'est-ce exactement avez-vous besoin dans btnSubmitApprovals_Click
? Normalement, vous obtenez les contrôles dans le Lié-/TemplateFields.La documentation dit: Le DataItem propriété est disponible uniquement pendant et après la RowDataBound cas d'un contrôle GridView. Pouvez-vous préciser le "après"?
Après signifie qu'après qu'il a été lié aux données dans la même page du cycle de vie (jusqu'à
Unload
).l'obtention de l'original DataItem me semblait le plus logique pour trouver les champs qui ont été modifiés. Donc, vous dites que je peux relier le GridView dans la fonction de clic?
Non, vous ne peut pas relier le contrôle GridView. Puis vous devez remplacer tous les changements et de prévenir les événements d'être soulevées. Vous devez évaluer les contrôles ou de l'utilisation de la GridView
RowUpdating
événement avec son OldValues
et NewValues
propriétés.OriginalL'auteur TheGerm | 2012-11-08
Vous devez vous connecter pour publier un commentaire.
Je comprends que vous voudrez peut-être avoir intellisense par la coulée de DataItem à TimeCardApproval. Vous pouvez le faire à la place. Utiliser le DataKeyNames pour stocker la Clé Primaire de chaque ligne qui devrait être
TimecardApprovalID
et de votre code d'accès de la clé primaire et l'utiliser pour obtenir l'élément d'origineRéglage de l'Clés
DataKeyField
dans le balisage..Cela a fonctionné comme un champion pour moi, mais je pense que la meilleure méthode est d'utiliser le RowUpdating action. Aussi, je n'ai eu aucun problème de casting DataItem, mais je ne pouvais pas comprendre comment obtenir le DataItem ou comment faire pour obtenir une référence à consulter. Cette DataKey l'information a été très utile. Merci! Pourriez-vous modifier votre réponse-à-dire, "C'est comment faire pour obtenir une référence à l'élément d'origine", donc je ne peux accepter cette réponse?
Juste un suivi. En fait, je dois aller dans cette voie, parce que la source de données que le contrôle GridView ne fait pas une "mise à jour" de la fonction. Tout à fait le crash-cours en ASP.NET.
Trouvé cela beaucoup plus aider: stackoverflow.com/questions/4633261/...
Ce ? l'accès à la DB (à l'aide de l'ID) pour chaque ligne ? 30 lignes, 30 appels à la DB ?
OriginalL'auteur codingbiz
Peut-être, cela vous aidera
La colonne de la grille:
Code derrière:
OriginalL'auteur Spoke
Le contrôle gridview databind événement se déclenche avant que le clic sur le bouton. Sons bizarre mais c'est asp.net page cycle de vie folie.
Essayez d'utiliser votre code dans gridview
RowUpdating
ouRowUpdated
événement.Oui,
e.Cancel
est ce que vous êtes en train de parler.OriginalL'auteur boruchsiper