2011-10-12 175 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