요약 : 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에 대한 주제 만 찾았습니다.
안녕하세요. 귀하의 질문을 검토하면 귀하가 무엇을 요구하고 있는지 이해하는 것이 약간 어렵습니다. 앞으로 질문을 게시 할 때 실제로 묻고있는 것에 대해 분명히 해보십시오. 어쩌면 모든 배경 + 코드 앞에 질문을 넣을 수도 있습니다. 그냥 생각! –
TextBox를 참조하는 모든 코드를 .aspx, .cs 및 javascript에 게시 할 수 있습니까? – gbs
gbs : TextBox는 RowDataBound 이벤트 외에도 다른 곳에서는 참조되지 않으며, 나열된 드래그 가능 객체와 드롭 가능 객체의 Create 이벤트가 있습니다. –