2014-02-10 3 views
0

요약 : GridView 내부의 숨겨진 텍스트 상자에 그리드 ID와 행 번호를 저장하므로 jQuery를 통해 세션 데이터를 업데이트 할 수 있습니다. GridView에서 끌어서 놓기 작업을 수행하면 텍스트 상자 중 하나에 다른 데이터가 저장됩니다. 왜이 사람이 될지 아는 사람 있습니까?포스트 백 이후의 ASP TextBox 추가 값

편집 : Page_Load 대신 Page_PreRender에서 데이터 바인딩을 수행하면 해결됩니다.

2 개의 드래그 가능하고 정렬 가능한 GridView가있는 페이지를 작성하려고합니다. 이것은 '프로덕션 페이지에서 이러한 메소드를 사용하기위한 준비로 jQuery를 가르치기'입니다. 행을 드래그 앤 드롭하면 포스트 백이 호출되어 기본 데이터 집합을 업데이트하고 모눈을 리 바인드합니다. 사용자는 그리드 뷰를 재정렬하고 행을 다른 행으로 드래그 할 수 있어야합니다. 나는 그것이해야 할 것보다 더 힘들게 만들고 있다고 느끼지만, 그것은 내 질문이 아닙니다.

포스트 백이 작동하도록 그리드 ID와 행 번호를 각 행에 저장하는 2 개의 숨겨진 텍스트 상자를 만듭니다. jQuery는 이것을 매개 변수로 사용하여 PageMethod 호출을 통해 코드 숨김으로 전달합니다. 그 모든 것은 처음입니다.

이미 끌어서 놓기 한 행에서 끌어서 놓기를 시도하면 행 번호 textbox.text 필드는 다른 행과 마찬가지로 x 대신 x가됩니다. 예를 들어 행 1을 어딘가에 드래그하면 행 1의 TextBox.Text가 1,1이됩니다. RowDataBound에서 숫자가 1이고 Page_Unload가 1,1 인 것을 확인했습니다. 왜 이런거야?

자바 스크립트 :

<script type="text/javascript"> 
$(document).ready(function() { 
    $(".draggable").draggable({ 
     helper: "clone", 
     stack: ".draggable", 
     snapto: ".droppable", 
     create: function(event, ui){ 
      var GridID = $(this).find(".gridid").attr("value"); 
      $(this).data("source",GridID); 
      var RowID = $(this).find(".rowindex").attr("value"); 
      $(this).data("rowid",RowID); 
     } 
    }); 
    $(".droppable").droppable({ 
     tolerance: "intersect", 
     greedy: true, 
     create: function(event, ui){ 
      var GridID = $(this).find(".gridid").attr("value"); 
      $(this).data("source",GridID); 
      var RowID = $(this).find(".rowindex").attr("value"); 
      $(this).data("rowid",RowID); 
     }, 
     drop: function(event, ui){ 
      var SourceGrid = ui.draggable.data("source"); 
      var SourceRow = ui.draggable.data("rowid"); 
      var DestGrid = $(this).data("source"); 
      var DestRow = $(this).data("rowid"); 
      PageMethods.MoveRow(SourceGrid, DestGrid, SourceRow, DestRow); 
      __doPostBack('',''); 
     } 
    }); 
}); 

</script> 

ASP :

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolderMain" runat="Server"> 
    <asp:GridView ID="gvSource" runat="server" ShowFooter="true" 
    OnRowDataBound="gvSource_RowDataBound"> 
    </asp:GridView> 
    <asp:GridView ID="gvDest" runat="server" ShowFooter="true" 
    OnRowDataBound="gvSource_RowDataBound"> 
    </asp:GridView> 

코드 숨김 (마이너스 데이터 바인딩 및 가져 오는 부분) :

protected void gvSource_RowDataBound(object sender, GridViewRowEventArgs e) { 
    TextBox gridid = new TextBox(); 
    gridid.Text = ((GridView)sender).ClientID; 
    gridid.CssClass = "gridid hidden"; 
    TextBox rowindex = new TextBox(); 
    switch (e.Row.RowType) { 
     case DataControlRowType.DataRow: 
      rowindex.Text = e.Row.RowIndex.ToString(); 
      break; 
     case DataControlRowType.Header: 
      rowindex.Text = "0"; 
      break; 
     case DataControlRowType.Footer: 
      rowindex.Text = ((DataTable)((GridView)sender).DataSource).Rows.Count.ToString(); 
      break; 
     default: 
      rowindex.Text = "null"; 
      break; 
    } 
    rowindex.CssClass = "rowindex hidden"; 
    e.Row.Cells[0].Controls.Add(gridid); 
    e.Row.Cells[0].Controls.Add(rowindex); 
} 
[WebMethod] 
public static string MoveRow(string _sourcegrid, string _destgrid, string _sourcerow, string _destrow) { 
     HttpContext ctx = HttpContext.Current; 
     DataTable dtsrc = _sourcegrid == ((DataTable)ctx.Session["dtFrom"]).TableName ? (DataTable)ctx.Session["dtFrom"] : (DataTable)ctx.Session["dtTo"]; 
     DataTable dtdest = _destgrid == ((DataTable)ctx.Session["dtFrom"]).TableName ? (DataTable)ctx.Session["dtFrom"] : (DataTable)ctx.Session["dtTo"]; 
     DataRow row = dtsrc.Rows[Convert.ToInt32(_sourcerow)]; 
     DataRow newrow = dtdest.NewRow(); 
     int newrowpos = Convert.ToInt32(_destrow); 
     newrow.ItemArray = row.ItemArray; 
     dtsrc.Rows.Remove(row); 
     dtdest.Rows.InsertAt(newrow, newrowpos); 
     return "1"; 
} 

CSS-지혜, 모든 행이 CssClass = "drappable draggable". 머리글과 바닥 글은 그냥 삭제할 수 있습니다. 나는 간결함을 위해 몇 가지 오류 검사 코드를 생략했다.

편집 : 요약을 추가 했으므로 변경된 내용이 아닌 데이터를 잃어버린 TextBox에 대한 주제 만 찾았습니다.

+0

안녕하세요. 귀하의 질문을 검토하면 귀하가 무엇을 요구하고 있는지 이해하는 것이 약간 어렵습니다. 앞으로 질문을 게시 할 때 실제로 묻고있는 것에 대해 분명히 해보십시오. 어쩌면 모든 배경 + 코드 앞에 질문을 넣을 수도 있습니다. 그냥 생각! –

+0

TextBox를 참조하는 모든 코드를 .aspx, .cs 및 javascript에 게시 할 수 있습니까? – gbs

+0

gbs : TextBox는 RowDataBound 이벤트 외에도 다른 곳에서는 참조되지 않으며, 나열된 드래그 가능 객체와 드롭 가능 객체의 Create 이벤트가 있습니다. –

답변

0

문제는 Page_Load에서 데이터를 바인딩하는 것과 관련이 있습니다. 모양은

protected void Page_Load(object sender, EventArgs e) { 
    if (!IsPostBack) { 
     GetData(); //Database fetch saves 2 DataTables to session variables 
    } 
    gvSource.DataSource = (DataTable)Session["dtFrom"]; 
    gvSource.DataBind(); 
    gvDest.DataSource = (DataTable)Session["dtTo"]; 
    gvDest.DataBind(); 
} 

으로 실패했습니다. 그것을 만들었습니다

protected void Page_Load(object sender, EventArgs e) { 
    if (!IsPostBack) { 
     GetData(); //Database fetch 
    } 
} 
protected void Page_PreRender(object sender, EventArgs e) { 
    gvSource.DataSource = (DataTable)Session["dtFrom"]; 
    gvSource.DataBind(); 
    gvDest.DataSource = (DataTable)Session["dtTo"]; 
    gvDest.DataBind(); 
} 

그것은 작동했습니다. 왜 그것이 효과가 있었는지 논쟁의 여지가 있습니다. 기본적인 SO 사용법과 예의 범절으로이 오랜 시간 lurker를 도와 준 것에 대해 감사드립니다.

+0

문제는 각 PageLoad에서 GV 데이터 바인딩으로 인한 것 같습니다. if (! IsPostBack) 블록 안에 databiding을 넣어야합니다. – gbs