2013-02-06 3 views
2

을 가지고 있지 않습니다ASP.Net의 GridView RowUpdate은 발사하지와의 RowUpdating 내가의 GridView 다음 한 NewValues ​​

<asp:GridView ID="gridCar" runat="server" RowStyle-ForeColor="Black" AllowSorting="true" OnSorting="gridCar_Sorting" AutoGenerateEditButton="true" OnRowEditing="gridCar_RowEditing" OnRowCancelingEdit="gridCar_RowCancelingEdit" OnRowUpdating="gridCar_RowUpdating" OnRowUpdated="gridCar_RowUpdated"></asp:GridView> 

내가 편집 버튼으로 선택한 행을 업데이트 할. 문제는, 내가 gridCar_RowUpdating에서하려고하면 e.NewValues에는 편집 된 값이 아니라 이전 값이 포함되어 있다는 것입니다.

내가 검색 한 결과 onRowUpdated 이벤트를 사용해야한다는 것을 알았지 만 또 다른 문제가 있습니다. 이 사건은 전혀 해고되지 않습니다. e.Cancel = falsegridCar_RowUpdating에 설정하려고했으나 문제가 해결되지 않습니다.

GridView는 DataTable에 바인딩됩니다.

편집 : 당신은 당신이 포스트 백에 GridView을 데이터 바인딩하지 않도록

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

using System.Data; 

public partial class _Default : Page 
{ 
    DataTable carsTable = new DataTable("cars"); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      carsTable.Columns.Add("CarID"); 
      carsTable.Columns.Add("CarRegNum"); 
      carsTable.Columns.Add("CarModel"); 
      carsTable.Columns.Add("CarType"); 
      carsTable.Columns.Add("CarOwner"); 

      carsTable.Rows.Add(1, "AAA-111", "Toyota", "Hatchback", "Matti"); 
      carsTable.Rows.Add(2, "BBB-222", "Mercedes-Benz", "Van", "Keijo"); 
      carsTable.Rows.Add(3, "CCC-333", "Renault", "Regular", "Matilda"); 

      carsTable.AcceptChanges(); 

      gridCar.DataSource = carsTable; 
      gridCar.DataBind(); 
     } 
    } 

    protected string dataViewSortDirection(SortDirection direction) 
    { 
     switch (direction) 
     { 
      case SortDirection.Ascending: 
       return "ASC"; 
      case SortDirection.Descending: 
       return "DESC"; 
      default: 
       throw new ArgumentOutOfRangeException(); 
     } 
    } 

    protected void gridCar_Sorting(object sender, GridViewSortEventArgs e) 
    { 
     gridCar.Sort(e.SortExpression, e.SortDirection); 

     // update GridView 
     gridCar.DataBind(); 
    } 

    protected void gridCar_RowEditing(object sender, GridViewEditEventArgs e) 
    { 
     gridCar.EditIndex = e.NewEditIndex; 
     gridCar.DataBind(); 
    } 

    protected void gridCar_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
    { 
     gridCar.EditIndex = -1; 
     gridCar.DataBind(); 
    } 

    protected void gridCar_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     labelDebug.Text += "b"; 
     //gridCar.EditIndex = -1; 
     //gridCar.DataBind(); 
    } 

    protected void gridCar_RowUpdated(object sender, GridViewUpdatedEventArgs e) 
    { 
     labelDebug.Text += "a"; 
     gridCar.EditIndex = -1; 
     gridCar.DataBind(); 
    } 
} 
+0

ViewState에 데이터 테이블을 저장하는 것은 페이지 크기를 늘리고 성능을 떨어 뜨리거나, 클라이언트 측에서 ViewState를 해독하여 DataTable이 안전하지 못하기 때문에 바람직하지 않습니다. –

+0

@TimSchmelter 내 경우에는 내가 무엇을 제안하겠습니까? – Kyto

+0

내 대답에 댓글을 달았으므로 데이터가 GridView의 ViewState에 저장되므로 데이터 소스를 유지할 필요가 없습니다. 그러므로'e.OldValues'와'e.NewValues'는 서버에서 클라이언트로 그리고 다시 서버로 DataTable을 전송하지 않아도 설정됩니다. 하지만 첫 번째로드 ('! IsPostBack')에서만 데이터 바인딩이 이루어 지도록해야합니다. –

답변

5

위치 : 여기에 내 코드입니까?

protected void Page_Load(Object sender, EventArgs e) 
{ 
    if(!Page.IsPostBack) 
    { 
     BindGridView(); 
    } 
} 

그렇지 않으면 당신이 이전 값을로드하고 RowUpdated 이벤트를 방지 : 당신은 if(!IsPostBack)에만 그렇게해야한다.

아마 잘못된 일을 많이하고 있어요

업데이트, 당신은 저를 보여줄 수 어떻게 정렬 지금 업데이트해야합니까?

여기에 전체 작업 예제입니다 :

public partial class GridTest : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      BindGrid(); 
     } 
    } 

    private void BindGrid() 
    { 
     var source = GetCarTable().Select("", this.SortExpression).CopyToDataTable(); 
     GridCar.DataSource = source; 
     GridCar.DataBind(); 
    } 

    private string SortExpression 
    { 
     get 
     { 
      if (ViewState["SortExpression"] == null || string.IsNullOrEmpty((String)ViewState["SortExpression"])) 
      { 
       ViewState["SortExpression"] = "CarModel ASC"; 
      } 
      return ViewState["SortExpression"].ToString(); 
     } 
     set { ViewState["SortExpression"] = value; } 
    } 

    private static DataTable GetCarTable() 
    { 
     DataTable carsTable = new DataTable("cars"); 
     carsTable.Columns.Add("CarID"); 
     carsTable.Columns.Add("CarRegNum"); 
     carsTable.Columns.Add("CarModel"); 
     carsTable.Columns.Add("CarType"); 
     carsTable.Columns.Add("CarOwner"); 

     carsTable.Rows.Add(1, "AAA-111", "Toyota", "Hatchback", "Matti"); 
     carsTable.Rows.Add(2, "BBB-222", "Mercedes-Benz", "Van", "Keijo"); 
     carsTable.Rows.Add(3, "CCC-333", "Renault", "Regular", "Matilda"); 

     return carsTable; 
    } 

    protected void gridCar_Sorting(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e) 
    { 
     string currentSortColumn = null; 
     string currentSortDirection = null; 
     currentSortColumn = this.SortExpression.Split(' ')[0]; 
     currentSortDirection = this.SortExpression.Split(' ')[1]; 

     if (e.SortExpression.Equals(currentSortColumn)) 
     { 
      //switch sort direction 
      switch (currentSortDirection.ToUpper()) 
      { 
       case "ASC": 
        this.SortExpression = currentSortColumn + " DESC"; 
        break; 
       case "DESC": 
        this.SortExpression = currentSortColumn + " ASC"; 
        break; 
      } 
     } 
     else 
     { 
      this.SortExpression = e.SortExpression + " ASC"; 
     } 

     //load the data with this SortExpression and DataBind the Grid 
     BindGrid(); 
    } 

    protected void GridCar_RowEditing(object sender, GridViewEditEventArgs e) 
    { 
     GridCar.EditIndex = e.NewEditIndex; 
     BindGrid(); 
    } 

    protected void GridCar_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
    { 
     GridCar.EditIndex = -1; 
     BindGrid(); 
    } 

    protected void GridCar_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     var oldValues = e.OldValues; 
     var newValues = e.NewValues; 
     // BindGrid(); 
    } 

    protected void GridCar_RowUpdated(object sender, GridViewUpdatedEventArgs e) 
    { 
     //BindGrid(); 
    } 
} 

영문 거의 변경되지 :

<asp:GridView ID="GridCar" 
      runat="server" 
      RowStyle-ForeColor="Black" 
      AllowSorting="true" 
      OnSorting="gridCar_Sorting" 
      AutoGenerateEditButton="true" 
      OnRowEditing="GridCar_RowEditing" 
      OnRowCancelingEdit="GridCar_RowCancelingEdit" 
      OnRowUpdating="GridCar_RowUpdating" 
      OnRowUpdated="GridCar_RowUpdated" 
      AutoGenerateColumns="true"> 
</asp:GridView> 
+0

오프닝 포스트를'Page_Load'로 편집했습니다. 비록 그것이 항상 오름차순 이었기 때문에 e.SortDirection에 대한 해결 방법을 만들어야했지만 내 정렬이 완벽하게 잘 작동하기 때문에 문제가 의심 스럽습니다. – Kyto

+0

'DataTable'을 ViewState에 저장하지 마십시오. 불안정하고 매우 비효율적입니다.'gridView'는 기본적으로 ViewState에 데이터를 저장하기 때문에 테이블을 전송할 필요가 없습니다. 내 대답은 남아있다. 데이터 바인딩을'! PostBack'-check에 넣어야한다. –

+0

ViewState에서 수행 한 모든 작업을 제거하고 현재 가지고있는 항목으로 원래 게시물을 다시 편집했습니다. 차이점은 이제 더 이상 아무것도 작동하지 않는다는 것입니다. 스택 오버플로가 발생하는'gridCar_Sorting'에서'gridCar.Sort'를 사용하여 정렬하려고하기 때문에 GridView를 정렬 할 수 없습니다. 나는 아마도 많은 것들을 잘못하고 있습니다. 어떻게 정렬하고 업데이트해야하는지 지금 보여줄 수 있습니까? – Kyto

0

귀하의 코드는 DataSourceID이 없습니다. 데이터 바인딩은 코드 뒤에 있다고 가정합니다.

방금 ​​/ 편집의 GridView의 행을 업데이트하려면

는 당신이 필요로하는 무엇을 을의 RowUpdating하지 (예 을 gridcar_ItemUpdating 용) ItemUpdating 이벤트입니다.

도움이되기를 바랍니다.

+0

GridView에 이러한 이벤트가 있습니까? '에서 찾을 수 없습니다. – Kyto

+0

오, 내 실수. 나는 이것이 DetailsView라고 생각했다. 팀의 대답이 문제를 해결하는 더 좋은 방법입니다. –