2013-07-31 29 views
3

我的代碼實際上會返回它以前從數據庫獲得的數據,但無法從網格控件獲取更新的數據。如何從網格中檢索更新的數據並將其更新到數據庫中

這是我的Default.aspx設計已完成的gridview。

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> 
</asp:Content> 
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
onrowupdating="GridView1_RowUpdating" onrowediting="GridView1_RowEditing" 
    onrowupdated="GridView1_RowUpdated" onrowcommand="GridView1_RowCommand"> 
    <Columns> 
     <asp:CommandField ShowEditButton="true" ShowDeleteButton="true" ShowInsertButton="true" /> 
     <asp:TemplateField HeaderText="Id" SortExpression="Id"> 
      <ItemTemplate> 
       <asp:Label ID="lbl_Id" Text='<%# Bind("id")%>' runat="server"> </asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Name" SortExpression="Name"> 
      <ItemTemplate> 
       <asp:Label ID="lbl_name" Text='<%# Bind("Name")%>' runat="server"></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="txt_name" Text='<%# Bind("Name")%>' runat="server"></asp:TextBox> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Address" SortExpression="address"> 
      <ItemTemplate> 
       <asp:Label ID="lbl_address" Text='<%# Bind("address")%>' runat="server"></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="txt_address" Text='<%# Bind("address")%>' runat="server"></asp:TextBox> 
      </EditItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
    </asp:GridView> 
    <asp:Label ID="lbl_msg" runat="server"></asp:Label> 
    </asp:Content> 



My.cs File 

我的代碼是在下面的類行更新方法。 我已經使用實體框架作爲在數據庫中進行操作的方法。

using System; 
using System.Collections.Generic; 
using System.Linq; 
    using System.Web; 
    using System.Web.UI; 
using System.Web.UI.WebControls; 
    using DatabaseModel; 

    public partial class _Default : System.Web.UI.Page 
    { 
    DatabaseEntities obj; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
    obj = new DatabaseEntities(); 
    GridView1.DataSource = obj.Records.ToList(); 
    GridView1.DataBind(); 
    } 
    string data; 

    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
    { 

    } 

    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
    GridViewRow row = GridView1.Rows[e.RowIndex]; 
    TextBox name = row.FindControl("txt_name") as TextBox; 
    TextBox address = row.FindControl("txt_address") as TextBox; 
    Label id = row.FindControl("lbl_Id") as Label; 
    int no = int.Parse(id.Text); 
    Record rec = obj.Records.First(x => x.Id == no); 
    rec.Name = name.Text; 
    rec.Address = address.Text; 
    obj.SaveChanges(); 
    data = name.Text; 
    lbl_msg.Text = name.Text; 
    } 

    protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e) 
    { 
    } 

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    } 
} 
+0

有asp.net'之間'略有區別,'ASP .net-mvc'和'asp-classic'。在StackOverflow上提出問題以確定您的目標平臺時,請適當使用這些標籤。 –

回答

1

你有LINQ查詢一些問題,使用lambda表達式,並使用此:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // do not rebind the data on postback 
    if (!IsPostBack) 
    { 
     obj = new DatabaseEntities(); 
     GridView1.DataSource = obj.Records.ToList(); 
     GridView1.DataBind(); 
    } 
} 
0

這可能是因爲在觸發GridView1_RowUpdating之前數據被反彈。嘗試改變Page_Load方法是這樣的:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // do not rebind the data on postback 
    if (!IsPostBack) 
    { 
     obj = new DatabaseEntities(); 
     GridView1.DataSource = obj.Records.ToList(); 
     GridView1.DataBind(); 
    } 
} 
+0

我試過了。 它確實可以工作,但在LINQ查詢中顯示爲空例外 –

+0

你說得對,我現在看到它。 obj變量僅在回發時實例化。只需移動「obj = new DatabaseEntities();」在if語句之上的行。 – MrHenkey

相關問題