【问题标题】:Inputs inside ListView doesn't change values from old to recently set on ItemUpdating eventListView 内的输入不会将 ItemUpdating 事件中的值从旧值更改为最近设置
【发布时间】:2011-01-03 22:30:06
【问题描述】:

如果有人帮助我了解这种情况,我将不胜感激。 我不知道为什么,但是当我编辑选定的 ListView 项目(包含几个文本框)然后在 ItemUpdating 事件中按更新按钮 时,我总是得到旧值而不是最近键入的值。 为什么?

  1. 我不使用 Page_Load 事件,所以我不需要检查 PostBack
  2. 我尝试在将数据从 DB 绑定到 ListView 之前获取值,因此它无法覆盖最近键入的值
  3. 我尝试在不同的事件处理程序中获取 TextBoxes 值 - ItemCommand、ItemUpdating、ItemDataBound - 结果始终相同
  4. Collection NewValues 和 OldValues 总是空的(我想这是因为我没有使用 SqlDataSource 控件)
  5. 我可以获得新值的唯一一种方法是检查请求,但在这种情况下我不能使用控制验证器...所以可能只使用请求是个坏主意。

这是ItemUpdating方法的代码:

    ListViewItem editItem = AdminUsersListView.EditItem;
    Guid userId = new Guid((editItem.FindControl("UserId") as HiddenField).Value);
    Hashtable dataUpdate = new Hashtable
    {
        { "UserName", Request[ (editItem.FindControl("UserNameNew") as TextBox).UniqueID ] },
        { "Email", Request[ (editItem.FindControl("Email") as TextBox).UniqueID ] },
        { "IsApproved", Request[ (editItem.FindControl("IsApproved") as CheckBox).UniqueID ] == "on" },
        { "IsLockedOut", Request[ (editItem.FindControl("IsLockedOut") as CheckBox).UniqueID ] == "on" }
    };


var x1 = dataUpdate["UserName"];  // this is corrent new value from Request
var x2 = (editItem.FindControl("UserNameNew") as TextBox).Text;  // this is WRONG! OLD! value from TextBox ... Why???

    using (Entities entities = new Entities())
    {
        aspnet_Membership membershipItem = entities.aspnet_Membership.Where(MBS => MBS.UserId == userId).FirstOrDefault();
        membershipItem.Email = dataUpdate["Email"].ToString();
        membershipItem.LoweredEmail = membershipItem.Email.ToLower();
        membershipItem.IsApproved = Convert.ToBoolean(dataUpdate["IsApproved"]);
        membershipItem.IsLockedOut = Convert.ToBoolean(dataUpdate["IsLockedOut"]);
        entities.SaveChanges();
        aspnet_Users userItem = entities.aspnet_Users.Where(USR => USR.UserId == userId).FirstOrDefault();
        userItem.UserName = dataUpdate["UserName"].ToString();
        userItem.LoweredUserName = userItem.UserName.ToLower();
        entities.SaveChanges();
    }

    AdminUsersListView.EditIndex = -1;
    AdminUsersListView.DataSource = _getDataList();
    AdminUsersListView.DataBind();

谢谢,艺术

【问题讨论】:

    标签: .net events listview controls


    【解决方案1】:

    我知道答案...该死的观点!!!

    注意这一点! 要始终获取实际数据,您需要将 EnableViewState 设置为“False”。

    <%@ Page EnableViewState="False"
             Language="C#" 
             MasterPageFile="~/App_Masters/Admin.Master" 
             AutoEventWireup="true" 
             CodeBehind="Users.aspx.cs" 
             Inherits="WebShop.Admin.Users" %>
    

    诀窍在于仅针对特定输入进行设置是不够的!这只有在我在 ASPX 中为整个页面设置后才对我有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2017-05-02
      相关资源
      最近更新 更多