2011-02-22 3 views
0

je suis coincé avec cette erreur depuis la dernière quelques heures .. je ne sais pas ce que je fais mal ici ..référence d'objet non définie à une instance d'un objet

<script type="text/javascript"> 
    function viewProfile(index) 
    { 
     var GridID = document.getElementById("PersonGridView"); 
     var row=GridID.rows[parseInt(index)+1]; 
     window.open('detailsid.aspx?'+row); 
    } 
    </script> 

 <Columns> 
      <asp:BoundField HeaderText="First Name" DataField="FirstName" /> 
      <asp:BoundField HeaderText="Last Name" DataField = "LastName" /> 
      <asp:BoundField HeaderText="HomePhoneNumber" DataField="HomePhoneNumber" /> 
      <asp:TemplateField HeaderText="ViewDetails"> 
      <ItemTemplate> 
      <asp:Button ID="Deatils" runat="server" Text="Details" /> 
      </ItemTemplate>  

      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Actions"> 
      <ItemTemplate> 
      <asp:Button ID="Modify" runat="server" Text="Modify" /> 
      <asp:Button ID="Delete" runat="server" Text="Delete" /> 

      </ItemTemplate> 
      </asp:TemplateField> 


     </Columns> 


     <FooterStyle BackColor="#CCCC99" /> 
     <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" /> 
     <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" /> 
     <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" /> 
     <AlternatingRowStyle BackColor="White" /> 
    </asp:GridView> 
</div> 
</form> 

<p> Code Behind : 
protected void PersonGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 

       if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
     var ID = PersonGridView.DataKeys[e.Row.RowIndex]["ID"].ToString(); 

       Button btnDetails = (Button)FindControl("Details"); 
       Button btnModify = (Button)FindControl("Modify"); 
       Button btnDelete = (Button)FindControl("Delete"); 
       btnModify.CommandName = "Modify"; 
       btnDelete.CommandName = "Delete"; 
       btnDetails.CommandName = "Details"; 
       btnDelete.CommandArgument = btnModify.CommandArgument = string.Format("{0}", ID); 
       btnDetails.Attributes["onclick"] = string.Format("viewProfile({0}); return false;", ID); 


      } 
     } 
+2

Vous devez publier le code à l'origine du problème avec ce que vous essayez d'accomplir plutôt que de supprimer le message d'erreur. – CAbbott

+0

je ne sais pas exactement ce qui crée le problème .. je suis un débutant ..plutôt que de confondre les gens, j'ai posté tout le scénario ici .. –

+0

Ma conjecture est que e.Row.RowIndex est non défini ou ne correspond pas à une DataKey. Vous devriez vérifier comment votre méthode est appelée pour s'assurer que ce paramètre est ce que vous attendez d'elle. – Cfreak

Répondre

0

Est-ce la ligne qui est de jeter l'erreur ?:

var ID = PersonGridView.DataKeys[e.Row.RowIndex]["ID"].ToString(); 

Cette ligne fait référence à un élément de tableau par index à deux endroits différents, vous devez donc faire un peu de débogage pour déterminer lequel est le problème. Fondamentalement, soit PersonGridView.DataKeys[] n'a pas un index qui correspond à e.Row.RowIndex ou cet élément n'a pas un index qui correspond à "ID". Vous devrez passer par un débogueur pour examiner ces valeurs lors de l'exécution ou lancer un code de débogage (instructions Response.Write et autres pour examiner les valeurs) pour voir ce qui se passe.

Une erreur courante est que le DataGridView exécute ce code sur des lignes non-données. En-tête, pied de page, etc. Vous pouvez étendre la portée de l'instruction if pour résoudre ce problème. Référence les index dans le conditionnel plutôt qu'hors de lui.

Edit: (En réponse à votre commentaire ci-dessous)

est-btnDetails ensemble à une instance d'un objet? Je suppose que ce n'est pas le cas. Vous devrez continuer le débogage et voir si le contrôle que vous essayez de trouver est réellement là. Je remarque que c'est dans un séparé ItemTemplate et TemplateField des autres boutons. Est-ce que cela cause un problème peut-être? Je ne suis pas entièrement familier avec ces contrôles serveur, donc je ne suis pas sûr de rien.

Je voudrais prendre un moment pour signaler que votre code est très fragile. Les problèmes que vous avez rencontrés sont le résultat de cela. Vous référencez les tableaux par des index manuellement, y compris l'utilisation d'une "chaîne magique" pour les référencer. Vous pourriez vouloir lancer une vérification d'erreur pour cela. Vous lancez également et plus tard en utilisant des objets sans vérifier s'ils existent en premier. FindControl peut très facilement retourner une référence null, comme lorsque le contrôle est introuvable.

Lancer des tonnes de vérification d'erreurs fait partie de la réalité de l'utilisation de ces contrôles de formulaires Web et de leurs anciennes méthodes de liaison de données. Beaucoup de code supplémentaire, mais c'est comme ça que ça se passe avec ces contrôles et directement lié aux DataSets faiblement typés et autres.

+0

je débogue .. mon erreur est passée à la référence d'objet non définie sur une instance d'un objet sur btnDetails.CommandName = "Details"; ligne –

+0

@Abid Ali: Réponse mise à jour. – David

2

Changement

 var ID = PersonGridView.DataKeys[e.Row.RowIndex]["ID"].ToString(); 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 

à

 if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      var ID = PersonGridView.DataKeys[e.Row.RowIndex]["ID"].ToString(); 

-à-dire extraire les DataKeys uniquement lorsque la ligne est de DataRow et non pour en-tête/pied de page, etc.

+0

je l'ai fait récemment .. et en faisant, l'erreur change à la référence d'objet n'est pas mis à une instance d'un objet .. –

+0

@Abid Ali, Pourriez-vous s'il vous plaît poster le HTML de retour? –

Questions connexes