2013-01-22 110 views
1

我在更新gridview時遇到問題!一切似乎都在起作用。但是當我完成編輯數據將不會保存!更新gridview行不保存數據

但當我點擊編輯正確的領域提示我輸入新的價值,但它不會保存!

這裏是我的ASP

<asp:GridView ID="GridView1" runat="server" CssClass="report" 
    AutoGenerateColumns="False" onrowediting="GridView1_RowEditing" 
    DataKeyNames="TimeID" onrowupdating="GridView1_RowUpdating" 
    onrowcommand="GridView1_RowCommand" 
    onrowcancelingedit="GridView1_RowCancelingEdit"> 

    <Columns> 



     <asp:BoundField DataField="date" Visible="true" ReadOnly="true" HeaderText="Date" /> 
     <asp:BoundField DataField="Description" HeaderText="Stage Description" ReadOnly="True" /> 


     <asp:TemplateField HeaderText="Start Time"> 
      <ItemTemplate> 
       <asp:Label ID="Label7" runat="server" Text='<%# ConvertToShotTime(Eval("StartTime")) %>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="txtStartTime" ValidationGroup="1" Width="90px" class="TimeEntry" runat="server" Text='<%# ConvertToShotTime(Eval("StartTime")) %>'></asp:TextBox> 
       <asp:RequiredFieldValidator ID="RequiredFieldValidator6" ControlToValidate="txtStartTime" runat="server" ErrorMessage="RequiredFieldValidator"></asp:RequiredFieldValidator> 
      </EditItemTemplate> 
     </asp:TemplateField> 




     <asp:TemplateField HeaderText="End Time"> 
      <ItemTemplate> 
       <asp:Label ID="Label1" runat="server" Text='<%# ConvertToShotTime(Eval("EndTime")) %>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="txtEndTime" class="TimeEntry" ValidationGroup="1" Width="90px" runat="server" Text='<%# ConvertToShotTime(Eval("EndTime")) %>'></asp:TextBox> 
       <asp:RequiredFieldValidator ID="RequiredFieldValidator66" ControlToValidate="txtEndTime" runat="server" ErrorMessage="RequiredFieldValidator"></asp:RequiredFieldValidator> 
      </EditItemTemplate> 
     </asp:TemplateField> 



     <asp:BoundField DataField="TimeInHours" HeaderText="Time Time (Hours)" ReadOnly="True" /> 

     <asp:CommandField ShowEditButton="true" ShowCancelButton="true" 
      ButtonType="Image" EditImageUrl="~/images/edit_record.jpg" 
      CancelImageUrl="~/images/edit_no.jpg" 
      UpdateImageUrl="~/images/update_record.jpg" /> 

     <asp:TemplateField ShowHeader="False"> 
      <ItemTemplate> 
       <asp:ImageButton ID="lnbCopy" runat="server" AlternateText="Delete" 
        CommandName="DeleteRecord" CommandArgument='<%# Bind("TimeID") %>' OnClientClick="return confirm('Are you sure you want to delete this row?');" ImageUrl="~/images/delete_record.jpg" /> 
      </ItemTemplate> 

      <EditItemTemplate> 
       <asp:Label ID="lblTimeID" runat="server" Text='<%# Eval("TimeID") %>'></asp:Label> 
      </EditItemTemplate> 
     </asp:TemplateField> 









    </Columns> 


</asp:GridView> 

這裏是我做了什麼背後的代碼

protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) { 
    GridView1.EditIndex = e.NewEditIndex; 
    loadTable(); 
} 

protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { 
    GridView1.EditIndex = -1; 
    loadTable(); 
} 

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { 

    GridViewRow row = GridView1.Rows[e.RowIndex] as GridViewRow; 


    var StartTime = row.FindControl("txtStartTime") as TextBox; 
    var EndTime = row.FindControl("txtEndTime") as TextBox; 
    var id = row.FindControl("lblTimeID") as Label; 

    SqlConnection conn = new SqlConnection(conStr.GetConnectionString("myServer1")); 

    SqlCommand comm = new SqlCommand(); 

    comm.CommandText = "UPDATE CDSTimeSheet SET StartTime = @StartTime, EndTime = @EndTime ,timeElapsed = datediff(minute,@startTime , @EndTime), timeInSeconds = datediff(second,@startTime , @EndTime) WHERE TimeID = @id"; 
    comm.Connection = conn; 

    comm.Parameters.AddWithValue("@id", id.Text); 
    comm.Parameters.AddWithValue("@StartTime", StartTime.Text); 
    comm.Parameters.AddWithValue("@EndTime", EndTime.Text); 

    conn.Open(); 
    comm.ExecuteNonQuery(); 
    conn.Close(); 
    GridView1.EditIndex = -1; 
    loadTable(); 
} 

我到底做錯了什麼?

+0

您是否收到任何錯誤?嘗試調試和結帳更新聲明是否id正在通過.. – Sunny

+0

不,沒有任何錯誤。它看起來就像是一個即使在編輯上一樣的插座! – Jaylen

+0

你可以顯示你的'loadTable()'函數嗎?你在那裏調用'GridView1.DataBind()'嗎? – jadarnel27

回答

0

這聽起來很像你在更新底層數據後不會在網格上調用DataBind。當您執行更新(可能內loadTable的方法,我看到引用了那裏),撥打

GridView1.DataBind(); 

這應該刷新網格中的數據。


您的意見後,我看你不使用的GridViewUpdateEventArgs參數NewValues採集獲得實際的傳入,更新字段值。試試這個:

String StartTime = e.NewValues["StartTime"].ToString(); 
String EndTime = e.NewValues["EndTime"].ToString(); 
String id = e.Keys[0].ToString(); 

注意,這些變量是字符串現在,不TextBox S,所以你不需要添加「文本」對他們,當你把它們添加作爲參數。

+0

是的,我在我的loadTable中有gridview1.bind。 Infact負載表的作品完美,我也有一個刪除工作正常!另外爲了確保在觸發編輯時調用正確的函數,我在屏幕上打印了一個測試,它的工作原理!但更新不是被執行的!我沒有我的代碼在我面前,所以我不能發佈我的加載表函數 – Jaylen

+0

@ user1915046是否有可能你的'WHERE'子句導致沒有行被更新?對於你的測試用例,如果你運行'UPDATE'語句作爲'SELECT'語句,你會得到任何結果嗎? (例如運行'SELECT * FROM CDSTimeSheet WHERE TimeID = 12345') – jadarnel27

+0

所以這裏是問題var StartTime = row.FindControl(「txtStartTime」)作爲TextBox; var EndTime = row.FindControl(「txtEndTime」)as TextBox; var id = row.FindControl(「lblTimeID」)as Label;返回初始選擇的相同sada!所以信息更新了相同的信息!我怎樣才能得到新的數據? – Jaylen