簡體   English   中英

回傳后的ASP TextBox額外值

[英]ASP TextBox extra values after postback

總結:我將網格ID和行號保存到GridView中一些隱藏的文本框中,以便可以通過jQuery更新會話數據。 在GridView上進行拖放操作后,其中一個文本框保存的數據與實際值不同。 有誰知道為什么會這樣嗎?

編輯:通過在Page_PreRender而不是Page_Load中進行數據綁定來解決。

我正在嘗試用2個可拖動和可排序的GridViews構建頁面。 這是一種“自學jQuery,准備在生產頁面上使用這些方法的項目”。 拖放行時,它將調用回發以更新基礎數據集並重新綁定網格。 用戶應該能夠重新排列網格視圖,還可以將行從一個拖動到另一個。 我感覺到我正在使它變得比應有的難度更大,但這不是我的問題。

為了使回發有效,我正在創建2個隱藏的文本框,它們在每行上存儲網格ID和行號。 jQuery使用這些參數作為參數,通過PageMethods調用傳遞給背后的代碼。 所有這些都是第一次。

如果我嘗試對已經拖放一次的行進行拖放,則行號textbox.text字段將變為x,x,而不是其他行。 例如,將第1行拖到某處會使第1行的TextBox.Text變為1,1。 我已驗證,在RowDataBound中,該數字為1,在Page_Unload中為1,1。 為什么是這樣?

Javascript:

<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>

后台代碼(減去DataBinding和訪存部分):

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 =“ droppable draggable”。 頁眉和頁腳只是可放置的。 為了簡潔起見,我省略了一些錯誤檢查代碼。

編輯:添加了一個摘要,我想補充一點,就是我仔細觀察了一下,發現僅有關TextBox丟失其數據而不更改它的主題。

問題與綁定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使用和禮節幫助這個長期潛伏者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM