回发后的ASP TextBox额外值

时间:2014-02-10 17:09:46

标签: c# jquery asp.net

总结:我将网格ID和行号保存到GridView中的一些隐藏文本框中,这样我就可以通过jQuery更新会话数据了。在GridView上执行拖放操作后,其中一个文本框保存的数据不同于应有的数据。有谁知道为什么会这样?

编辑:通过在Page_PreRender而不是Page_Load中进行数据绑定来解决。

我正在尝试使用2个可拖动和可排序的GridView构建一个页面。这是一个'自学jQuery,准备在生产页面上使用这些方法'的项目。拖放行时,它会调用回发来更新基础数据集并重新绑定网格。用户应该能够重新排序网格视图,并将行从一个拖动到另一个。我觉得我做得比现在更难,但这不是我的问题。

为了使回发有效,我创建了两个隐藏的文本框,用于存储每行的网格ID和行号。 jQuery使用这些作为参数通过PageMethods调用传递给代码隐藏。所有这些都是第一次。

如果我尝试对已经拖放过一行的行进行拖放,则行号textbox.text字段变为x,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>

Code-Behind(减去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-wise,所有行都有CssClass =“droppable draggable”。页眉和页脚只是可以删除。为简洁起见,我省略了一些错误检查代码。

编辑:添加了一个摘要,我想补充说我已经浏览过SO并且只找到有关TextBox丢失数据的主题,而不是更改它。

1 个答案:

答案 0 :(得分: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使用和礼仪的人。