2013-06-07 2 views
0

Vous avez tenté de mettre à jour un champ dans GridView mais sans succès. C'est l'erreur que j'ai reçue La référence d'objet n'est pas définie sur une instance d'un objet. Il continue à casser à cette ligne dt.Rows(row.DataItemIndex)("TicketID") = (CType(row.FindControl("TicketID"), TextBox)).ToString En tant que débutant, je ne sais pas comment résoudre ce problème. Toute aide est très appréciée.NullReferenceException - Nécessité de mettre à jour le champ

code-behind:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    Dim dt As New DataTable("historyList") 

    dt.Columns.Add("TicketID", GetType(Integer)) 
    dt.Columns.Add("DateCreated", GetType(DateTime)) 
    dt.Columns.Add("FullName", GetType(String)) 
    dt.Columns.Add("TicketType", GetType(String)) 
    dt.Columns.Add("Subject", GetType(String)) 
    dt.Columns.Add("Message", GetType(String)) 
    dt.Columns.Add("Status", GetType(String)) 

    For i = 0 To 6 
     Dim tableRow = dt.NewRow() 
     tableRow("TicketID") = i 
     tableRow("DateCreated") = Now() 
     tableRow("FullName") = i.ToString() 
     tableRow("TicketType") = i.ToString() 
     tableRow("Subject") = i.ToString() 
     tableRow("Message") = i.ToString() 
     tableRow("Status") = i.ToString() 
     dt.Rows.Add(tableRow) 
    Next 

    Session("dt") = dt 

    BindData() 

End Sub 

Protected Sub GridView1_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs) 
    GridView1.EditIndex = e.NewEditIndex 
    BindData() 
End Sub 
Protected Sub GridView1_RowCancelingEdit(ByVal sender As Object, ByVal e As GridViewCancelEditEventArgs) 
    GridView1.EditIndex = 1 
    BindData() 
End Sub 

Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs) 
    Dim dt = CType(Session("dt"), DataTable) 

    'if your current DataSource be in Session 
    Dim row As GridViewRow = GridView1.Rows(e.RowIndex) 

    dt.Rows(row.DataItemIndex)("TicketID") = (CType(row.FindControl("TicketID"), TextBox)).ToString 
    dt.Rows(row.DataItemIndex)("DateCreated") = (CType(row.FindControl("DateCreated"), TextBox)).ToString 
    dt.Rows(row.DataItemIndex)("FullName") = (CType(row.FindControl("FullName"), TextBox)).ToString 
    dt.Rows(row.DataItemIndex)("TicketType") = (CType(row.FindControl("TicketType"), TextBox)).ToString 
    dt.Rows(row.DataItemIndex)("Subject") = (CType(row.FindControl("Subject"), TextBox)).ToString 
    dt.Rows(row.DataItemIndex)("Message") = (CType(row.FindControl("Message"), TextBox)).ToString 
    dt.Rows(row.DataItemIndex)("Status") = (CType(row.FindControl("Status"), TextBox)).ToString 

    Session("dt") = dt 
    GridView1.EditIndex = 1 
    BindData() 

End Sub 

Private Sub BindData() 

    'GridView1.DataSource = Session("dt") 
    GridView1.DataBind() 

End Sub 
+0

Assurez-vous que la valeur de 'rows.DataItemIndex' est un index valide dans votre table de données. –

+0

@JoelCoehoorn: En fait, j'ai utilisé 'rows.DataItemIndex' d'un exemple MSDN. – Esther

Répondre

0

Il est probablement parce que la méthode FindControl retourne des références null (si je me souviens bien, je parle de la valeur nothing en VB). Cela signifierait que les contrôles ne sont pas stockés dans la rangée, alors vérifiez cela.

+0

vb.net permet d'appeler des méthodes sans arguments sans les parenthèses –

+0

Merci. .NET est mon jour au jour, mais je n'ai pas touché VB depuis des lustres. Modification – Renan

+0

@Renan: Ajout de la parenthèse après chaque appel à ToString et cela n'a pas fonctionné. Même message d'erreur J'ai alors essayé de changer .ToString() en .Text, sans chance non plus. Si les contrôles ne sont pas stockés dans la ligne, existe-t-il une autre méthode pour remplacer FindControl? – Esther

Questions connexes