2010-06-29 66 views
0

我有一个显示问题列表的gridview。只有一个字段是可编辑的,并且如果信息已被编辑,则电子邮件被发送到特定的“命运”。所有工作正常,但是当我尝试在我的SendEmail函数中使用Findcontrol时,我得到 “对象引用未设置为对象的实例”。我如何获得问题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

你的第一步应该是打破代码来分隔行找到out哪个语句返回空引用:

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

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

这将告诉您问题控件是否未找到或收件人是否不在事件参数中。

从那里你可以找出什么是没有正确设置。

+0

嗨,谢谢你的帮助。我不确定我的答案需要做什么。 – netNewbi3 2010-06-29 10:51:44

+0

@ netNewbi3 - 一旦你分离了你的代码,你可以通过调试器来找出哪一行实际上引发了空引用异常。例如,它*可能是'FindControl'返回'null'。有了这些信息,你就可以明白为什么会出现这种情况。是标签名称不正确,还是您在标签的错误容器中查找? – ChrisF 2010-06-29 11:04:35

+0

ChrisF,谢谢。标签名称是正确的。我如何检查我是否在标签的错误容器中查找? – netNewbi3 2010-06-29 11:19:11