2013-09-11 2 views
0

Пользователь переходит на эту страницу для редактирования/обновления сведений для конкретного Сотрудника. Детали сотрудника отображаются в DetailsView, который привязан к базе данных Northwind. Проблема заключается в том, когда я нажимаю «Изменить» и меняю некоторые данные, а затем «Обновить» - поля возвращаются в исходное состояние, как будто ничего не изменилось.Webforms DetailsView не сохраняет данные при редактировании/обновлении

код Webform: за

<form id="form1" runat="server"> 

    <asp:DetailsView ID="DetailsViewEditEmployee" 
     runat="server" 
     AutoGenerateRows="False"   
     Height="50px" 
     Width="314px"    
     OnItemCommand="DetailsViewEditEmployee_ItemCommand" 
     OnModeChanging="DetailsViewEditEmployee_ModeChanging" 
     OnItemUpdating="DetailsViewEditEmployee_ItemUpdating" 
     OnItemUpdated="DetailsViewEditEmployee_ItemUpdated" > 
     <Fields> 
      <asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID" InsertVisible="False" ReadOnly="False" SortExpression="EmployeeID" /> 
      <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" /> 
      <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" /> 
      <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" /> 
      <asp:BoundField DataField="Address" HeaderText="Address" SortExpression="Address" /> 
      <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />    
      <asp:CommandField ButtonType="Button" CausesValidation="False" ShowEditButton="True" />   
     </Fields> 
    </asp:DetailsView> 
    CustomerID: 
    <asp:Literal Text="text" runat="server" id="LiteralCustomerId" Mode="Encode" /> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" DeleteCommand="DELETE FROM [Employees] WHERE [EmployeeID] = @EmployeeID" InsertCommand="INSERT INTO [Employees] ([LastName], [FirstName], [Title], [Address], [City]) VALUES (@LastName, @FirstName, @Title, @Address, @City)" SelectCommand="SELECT [EmployeeID], [LastName], [FirstName], [Title], [Address], [City] FROM [Employees]" UpdateCommand="UPDATE [Employees] SET [LastName] = @LastName, [FirstName] = @FirstName, [Title] = @Title, [Address] = @Address, [City] = @City WHERE [EmployeeID] = @EmployeeID"> 
     <UpdateParameters> 
      <asp:Parameter Name="LastName" Type="String" /> 
      <asp:Parameter Name="FirstName" Type="String" /> 
      <asp:Parameter Name="Title" Type="String" /> 
      <asp:Parameter Name="Address" Type="String" /> 
      <asp:Parameter Name="City" Type="String" /> 
      <asp:Parameter Name="EmployeeID" Type="Int32" /> 
     </UpdateParameters> 
    </asp:SqlDataSource>   
</form> 

Код:

public partial class EmployeesEdit : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Request.Params["Id"] == null) 
     { 
      Response.Redirect("EmployeesRepeater.aspx"); 
     } 

     this.LiteralCustomerId.Text = Request.Params["id"]; 
     var id = int.Parse(Request.Params["id"]); 
     using (var context = new NorthwindEntities()) 
     { 
      var employees = context.Employees; 
      var empToList = employees.ToList(); 
      var current = 
       from emp in empToList 
       where emp.EmployeeID == id 
       select emp; 
      this.DetailsViewEditEmployee.DataSource = current; 
      this.DetailsViewEditEmployee.DataBind(); 
     } 
    } 

    protected void DetailsViewEditEmployee_ModeChanging(object sender, DetailsViewModeEventArgs e) 
    { 
     if (e.NewMode == DetailsViewMode.Edit) 
     { 
      this.DetailsViewEditEmployee.ChangeMode(e.NewMode); 
      this.DetailsViewEditEmployee.DataBind(); // add this and check 
     } 
     if (e.CancelingEdit) 
     { 
      this.DetailsViewEditEmployee.ChangeMode(DetailsViewMode.ReadOnly); 
      this.DetailsViewEditEmployee.DataBind(); // add this and check 
     } 
    } 

    protected void DetailsViewEditEmployee_ItemUpdating(object sender, DetailsViewUpdateEventArgs e) 
    { 
     for (int i = 0; i < e.NewValues.Count; i++) 
     { 
      if (e.NewValues[i] != null) 
      { 
       e.NewValues[i] = Server.HtmlEncode(e.NewValues[i].ToString()); 
      } 
     } 
    } 

    protected void DetailsViewEditEmployee_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e) 
    { 
     this.DetailsViewEditEmployee.DataBind();   
    } 

    protected void DetailsViewEditEmployee_ItemCommand(object sender, DetailsViewCommandEventArgs e) 
    { 
     if (e.CommandName.Equals("New")) 
     { 
      this.DetailsViewEditEmployee.ChangeMode(DetailsViewMode.Insert); 
      this.DetailsViewEditEmployee.DataBind(); 
     } 
     else if (e.CommandName.Equals("Edit")) 
     { 
      this.DetailsViewEditEmployee.ChangeMode(DetailsViewMode.Edit); 
      this.DetailsViewEditEmployee.DataBind(); 
     } 
    }   
} 

ответ

0

Вы должны databid в DetailsView только на начальной загрузки, а не на каждом постбэка:

if(!IsPostBack) 
{ 
    using (var context = new NorthwindEntities()) 
    { 
     var employees = context.Employees; 
     var empToList = employees.ToList(); 
     var current = 
      from emp in empToList 
      where emp.EmployeeID == id 
      select emp; 
     this.DetailsViewEditEmployee.DataSource = current; 
     this.DetailsViewEditEmployee.DataBind(); 
    } 
} 

Page_Load запускается перед событиями, привязывая его снова, вы предотвращаете событие от увольнения.

+0

Хорошо, но когда я сделал то, что вы предложили, нажав кнопку «Редактировать», DetailsView просто исчезнет со страницы. – Todo

+0

@ Тодо: Я не знаю, почему это исчезает, вы делаете его невидимым где-то? Вам следует извлечь метод 'DataBindDetailsViewEditEmployee', где вы переместите весь код из' Page_Load', который находится внутри (включая) 'using'-statement. Затем вы можете вызвать этот метод из 'Page_Load' ('! IsPostBack'), а также из событий, где вам нужно перепроверить «DetailsView». Затем вам просто нужно заменить эту строку 'this.DetailsViewEditEmployee.DataBind();' с 'DataBindDetailsViewEditEmployee();'. –