2011-10-12 177 views
0

我已经有了我的代码,当用户单击我的GridView中的删除按钮时,将数据删除到数据库外,但GridView未更新以反映新的数据更改。数据库更新,但GridView保持不变

这里是我的代码:提前

<asp:GridView runat="server" ID="grdQuestions" AutoGenerateColumns="false" Width="100%" CellSpacing="10" 
     PagerSettings-Visible="true"> 
     <HeaderStyle CssClass="aspNetHeader" /> 
     <Columns> 
      <asp:BoundField DataField="QuestionID" HeaderText="QID" /> 
      <asp:BoundField DataField="ModuleID" HeaderText="Mod #" /> 
      <asp:BoundField DataField="QuestionText" HeaderText="Question" /> 
      <asp:BoundField DataField="CorrectAnswer" HeaderText="Answer" /> 
      <asp:BoundField DataField="AnswerNote" HeaderText="Note" /> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <asp:HyperLink runat="server" ID="lnkEdit" Text="Edit"></asp:HyperLink> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <asp:LinkButton runat="server" ID="lnkDelete" Text="Delete" CommandArgument='<%# eval("QuestionID") %>'></asp:LinkButton> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

Protected Sub grdQuestions_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles grdQuestions.RowCommand 
    If e.CommandName = "Delete" Then 

     sql = "delete from tmp_Questions where QuestionID = " & e.CommandArgument 
     Dim cmd As New SqlCommand(sql, d.SQLConnection) 

     d.SQLConnection.Open() 
     cmd.ExecuteNonQuery() 
     d.SQLConnection.Close() 

     GetModuleData() 
    End If 
End Sub 

Protected Sub grdQuestions_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles grdQuestions.RowDeleting 
    GetModuleData() 
End Sub 

Private Sub GetModuleData() 
    ' ddlModules is a drop down where the user can select a module to filter questions by. 
    Dim selid As Integer = ddlModules.SelectedItem.Value 
    sql = "select QuestionID, ModuleID, LEFT(QuestionText, charindex(' ', QuestionText, 30)) as QuestionText, CorrectAnswer," & vbCrLf & _ 
     "AnswerNote from tmp_Questions" & vbCrLf & _ 
     "where ModuleID = " & selid & vbCrLf & _ 
     "order by ModuleID" 
    Dim cmd As New SqlCommand(sql, d.SQLConnection) 
    cmd.CommandText = sql 

    QuestionAdapter.SelectCommand = cmd 
    QuestionAdapter.Fill(QuestionData) 

    If QuestionData.Tables(0).Rows.Count > 0 Then 

     grdQuestions.DataSource = QuestionData 
     grdQuestions.DataBind() 
    End If 
End Sub 

感谢在看看!

编辑1:
有没有通过一些代码步进,发现e.CommandArgument没有在grdQuestions_RowCommand

EDIT 1(修订版)得到一个值:
e.CommandArgument没有得到事实价值是我的错误。我改变了它的价值被分配的方式,而不删除以前的方法。 代码运行通过grdQuestions_RowCommand,然后进入grdQuestions_RowDeleting,然后执行GetModuleData
我有一种感觉,要查看对网格的更改,可能需要PostBack,但我已将所有DataBinding移除到If Not IsPostBack Then块,因为替代方式导致DropDownList的问题,其选择被用作填充网格的引用(ddlModules选择了其问题将显示在网格中的模块)。

+0

“GridView未更新以反映新数据更改”是什么意思?你有一个异常,你有调试,以确保'grdQuestions.DataBind()'被调用吗?您的DataTable/DataSet在被DataAdapter('ClearBeforeFill')填充之前是否被清除? –

+0

@Tim请参阅新的编辑,对缺乏信息的道歉。 – Ortund

回答

0

您既没有指定CommandName="Edit"lnkEdit也没有为lnkDelete指定CommandName="Delete"

我有一种感觉,查看更改网格,回发可能需要

当然,必须发生回传和GridView控件必须被数据绑定到它的数据源,你已经删除后,再次记录。但是当用户点击删除链接并且已经处理了该回发时,该回发已经发生。 调试并确保记录被删除,然后 GridView再次获取数据绑定。

+0

行被从数据库中删除。问题是,我似乎无法得到GridView更新。正在报告的代码中没有错误。 – Ortund

+0

当代码将被删除的代码永远不会被调用时,该行如何被删除?当你说'e.CommandArgument'“没有得到一个值”时,它如何被删除,因此SQL格式不正确? –

+0

在你现在看到的代码之前,我没有从代码中删除效率较低的逻辑,这是破坏e.CommandArgument情况。经过纠正,该行现在正从数据库中删除。 – Ortund