2011-01-03 2 views
1

誰かがこの状況を理解するのを助けていただければ幸いです。 理由はわかりませんが、選択したListViewアイテム(テキストボックスはほとんどありません)を編集し、UpdateUpdateイベントでUpdateボタンを押すと、最近入力されたものの代わりに古い値が表示されます。 なぜですか?私はポストバックでチェックする必要はありませんので、ListView内の入力は、古いものから最近の値に変更されませんItemUpdatingイベント

  1. 私は、Page_Loadイベントを使用していない私は、リストビューにDBからデータをバインドする前に値を取得しようと、それは最近入力した値を上書きすることはできません
  2. ItemCommand、ItemUpdating、ItemDataBound - - 結果siが
  3. 同じ
  4. 常にNewValuesとOldValuesは常に空ですコレクション(私はSqlDataSourceコントロールを使用していないので、これはあると思います)
  5. 私は別のイベントハンドラでのTextBoxの値を取得しようとしました私は新しい価値を得ることができる唯一の方法です - リクエストをチェックするが、この場合はコントロールバリデーターを使うことができない。だからおそらくリクエストだけで作業するのは悪い考えだ。

これは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(); 

おかげで、アート

答えて

2

私は答えを知っている... F *** INGビューステート!!!

これにご注意ください! 実際にデータを取得するには、EnableViewStateを "False"に設定する必要があります。

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

トリックは、特定の入力用に設定するだけでは不十分です。これは、ASPXの全ページでこれを設定した後にのみ役立ちました。

関連する問題