2010-06-29 3 views
0

질문리스트가있는 gridview가 있습니다. 하나의 필드 만 편집 할 수 있으며 정보가 편집 된 경우 이메일이 특정 "운명"으로 전송됩니다. 모두 잘 작동하지만 FindControl을 사용하여 SendEmail 함수에서 Question ID를 얻으려고하면 "객체 참조가 객체의 인스턴스로 설정되지 않았습니다."라는 메시지가 나타납니다. 질문 ID는 어떻게 얻을 수 있습니까?gridview 행을 업데이트 한 후 값 가져 오기

내의 SqlDataSource :

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:conn %>" SelectCommand="SELECT Questions.QuestionID, Questions.Name, Questions.Question, Questions.Destiny, Questions.DateQuestion, Questions.Answer" UpdateCommand="UPDATE Questions SET Destiny = @Destiny WHERE (QuestionID = @QuestionID)"> 
    <SelectParameters> 
    </SelectParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="Destiny" /> 
     <asp:Parameter Name="QuestionID" /> 
    </UpdateParameters> 
</asp:SqlDataSource> 

내있는 gridview :

 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="QuestionID" OnRowUpdated="GridView1_RowUpdated" 
    DataSourceID="SqlDataSource1"> 
    <Columns> 

     <asp:TemplateField HeaderText="ID" InsertVisible="False" SortExpression="QuestionID"> 
      <ItemTemplate> 
       <asp:Label ID="LabelQuestionID" runat="server" Text='<%# Bind("QuestionID") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField>  

    <asp:TemplateField HeaderText="Question" InsertVisible="False" SortExpression="Question"> 
      <ItemTemplate> 
       <asp:Label ID="LabelQuestion" runat="server" Text='<%# Bind("Question") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 

    <asp:TemplateField HeaderText="Date" SortExpression="DateQuestion"> 
         <ItemTemplate> 
       <asp:Label ID="LabelDateQuestion" runat="server" Text='<%# Bind("DateQuestion", "{0:g}") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 



     <asp:TemplateField HeaderText="Destiny" SortExpression="Destiny"> 
          <ItemTemplate> 
       <asp:Label ID="LabelDestiny" runat="server" Text='<%# Bind("Destiny") %>'></asp:Label> 

      </ItemTemplate> 

      <EditItemTemplate> 
      <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("Destiny") %>'></asp:TextBox> 
      </EditItemTemplate> 
     </asp:TemplateField> 



     <asp:TemplateField ShowHeader="False"> 
      <EditItemTemplate> 
       <asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="True" CommandName="Update" 
        Text="Update"></asp:LinkButton> 
       <asp:LinkButton ID="LinkButton3" runat="server" CausesValidation="False" CommandName="Cancel" 
        Text="Cancel"></asp:LinkButton> 
      </EditItemTemplate> 
      <ItemTemplate> 
       <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"></asp:LinkButton> 
      </ItemTemplate> 
     </asp:TemplateField> 




     </Columns> 
</asp:GridView> 
뒤에

내 코드 :

Protected Sub GridView1_RowUpdated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdatedEventArgs) 

    If Trim(e.OldValues("Destiny").ToString <> Trim(e.NewValues("Destiny").ToString)) Then 
    QuestionID = GridView1.FindControl("LabelQuestionID").ToString 
    SendEmailtoAdviser(Trim(e.NewValues("Destiny")), QuestionID) 
    End If 
    End Sub 

답변

0

다음 코드를 사용하여 업데이트를 수행하면 Gridview에서 특정 셀의 값을 가져올 수 있습니다. 제 경우에는 gridview에서 첫 번째 열의 ID를 검색하고 싶었습니다.

Protected Sub GridView1_RowUpdated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdatedEventArgs) 
    If Trim(e.OldValues("Destiny").ToString <> Trim(e.NewValues("Destiny").ToString)) Then 
     Dim index As Integer = GridView1.EditIndex 
     Dim row As GridViewRow = GridView1.Rows(index) 
     SendEmailtoAdviser(Trim(e.NewValues("Destiny").ToString), row.Cells(0).Text) 
    End If 
End Sub 
0

첫 번째 단계는 찾을 줄을 분리하는 코드를 분해하는 것 어떤 진술이 당신에게 null 참조를 반환하는지 :

QuestionControl = GridView1.FindControl("LabelQuestionID") 
QuestionID = QuestionControl.ToString 

Recipient = e.NewValues("Destiny") 
SendEmailtoAdviser(Trim(Recipient), QuestionID) 

질문 컨트롤이 발견되지 않았거나받는 사람이 이벤트 인수에 없는지 여부를 알려줍니다.

거기에서 올바르게 설정되지 않은 것을 파악할 수 있습니다.

+0

안녕하세요. 도움을 주셔서 감사합니다. 나는 당신의 대답에서 무엇을해야하는지 잘 모르겠습니다. – netNewbi3

+0

@ netNewbi3 - 일단 코드를 분할하면 디버거를 단계별로 실행하여 어떤 라인이 실제로 null 참조 예외를 발생시키는 지 확인할 수 있습니다. 예를 들어'FindControl'이'null'을 리턴하고있을 수도 있습니다. 이 정보를 사용하면 왜 그런지 알 수 있습니다. 라벨 이름이 잘못 되었습니까? 아니면 틀린 상자에서 라벨을 찾고 있습니까? – ChrisF

+0

ChrisF, 감사합니다. 레이블 이름이 정확합니다. 라벨이 잘못된 컨테이너를 찾고 있는지 어떻게 확인할 수 있습니까? – netNewbi3