ListView中的输入不会更改ItemUpdating事件中从old到最近设置的值

时间:2011-01-03 22:30:07

标签: .net events listview controls

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

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

    谢谢,艺术

1 个答案:

答案 0 :(得分:2)

我知道答案...... F *** ING VIEWSTATE !!!

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

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

诀窍是仅仅为特定输入设置它是不够的!这只是在我为ASPX中的整个页面设置了这个之后帮助了我。