具有客户端分页的 Gridview 不会为其他页面上的文本框调用 OnTextChanged

发布于 2024-12-20 14:42:44 字数 3531 浏览 3 评论 0原文

我正在使用 Datatables 为我的 ASP.NET Gridview 提供更好的客户端功能。一切都运转良好。这个特定的网格视图始终处于“编辑模式”,或者是文本框的集合而不是字符串数据值。

我在回发上有它(只能通过单击“保存”按钮来完成 - 其他一切都在客户端完成),我保存所有已标记为已修改的记录。记录由回发时发生的 Textbox 的 OnTextChanged 事件标记为已修改。

这是问题和一个示例:如果我修改第 1 页上的值,请转到第 2 页,然后单击“保存...OnTextChanged”似乎只会为第 2 页上的文本框调用,因此不会保存第 1 页上的修改值。如何确保最终单击按钮时保存所有页面上更改的值?

编辑: 我真的很想让这个工作。这是我的 Javascript 部分的全部内容,其中包含 Yuriy 的补充。

<script type="text/javascript">

/* Create an array with the values of all the input boxes in a column */
$.fn.dataTableExt.afnSortData['dom-text'] = function (oSettings, iColumn) {
   var aData = [];
   $('td:eq(' + iColumn + ') input', oSettings.oApi._fnGetTrNodes(oSettings)).each(function () {
   aData.push(this.value);
   });
   return aData;
}

/* Make datatables send all rows to the server for saving */
$.fn.dataTableExt.fnGetHiddenNodes = function (oSettings) {
   var anNodes = this.oApi._fnGetTrNodes(oSettings);
   var anDisplay = $('tbody tr', oSettings.nTable);

   for (var i = 0; i < anDisplay.length; i++) {
      var iIndex = jQuery.inArray(anDisplay[i], anNodes);
      if (iIndex != -1) {
         anNodes.splice(iIndex, -1);
      }
    }
    return anNodes;
}

$(document).ready(function () {

   setTimeout(function () {
   $(document).ready(function () {

      $("#containers_gv").dataTable({
        "bJQueryUI": true,
        "bSortClasses": false,
        "sPaginationType": "full_numbers",
        "sDom": '<"#top"fl>rt<"#bottom"ip><"clear">',
        "aoColumns": [
        null,
        { "sSortDataType": "dom-checkbox" },
                { "sSortDataType": "dom-text" },
        { "sSortDataType": "dom-text", "sType": "numeric" },
        { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
            { "sSortDataType": "dom-text" },
                { "sSortDataType": "dom-checkbox" },
                { "sSortDataType": "dom-text" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric"}]
      });

      $('#bottom').appendTo('#gv_controls');
      $('#top').appendTo('#gv_topcontrols');


  }), 1000
});

$(function () {
  $("#containers_gv").prepend($("<thead></thead>").append($(this).find("tr:first"))).dataTable();
});

});

function doSave() {
  var grid = $("#containers_gv");
  var hiddenRows = grid.dataTable().fnGetHiddenNodes();
  $.each(hiddenRows, function () { $(this).css("display", "none").appendTo(grid); });
  return true;
}   

</script>

I am using Datatables to give better client-side functionality to my ASP.NET Gridview. All is working great. This particular gridview is always in "edit mode", or is a collection of textboxes rather than string data values.

I have it so on Postback (which can only be done by clicking a Save button - everything else is done client-side), I save any records that have been marked modified. Records are marked modified by Textbox's OnTextChanged event which occurs on the postback.

Here is the problem and an example: If I modify a value on page 1, go to page 2, and then click Save...OnTextChanged only seems to get called for textboxes on page 2 so the modified value on page 1 is not saved. How can I make sure the values changed on all pages get saved when the button is finally clicked?

EDIT:
I really want to get this working. Here is the entirety of my Javascript section with Yuriy's additions.

<script type="text/javascript">

/* Create an array with the values of all the input boxes in a column */
$.fn.dataTableExt.afnSortData['dom-text'] = function (oSettings, iColumn) {
   var aData = [];
   $('td:eq(' + iColumn + ') input', oSettings.oApi._fnGetTrNodes(oSettings)).each(function () {
   aData.push(this.value);
   });
   return aData;
}

/* Make datatables send all rows to the server for saving */
$.fn.dataTableExt.fnGetHiddenNodes = function (oSettings) {
   var anNodes = this.oApi._fnGetTrNodes(oSettings);
   var anDisplay = $('tbody tr', oSettings.nTable);

   for (var i = 0; i < anDisplay.length; i++) {
      var iIndex = jQuery.inArray(anDisplay[i], anNodes);
      if (iIndex != -1) {
         anNodes.splice(iIndex, -1);
      }
    }
    return anNodes;
}

$(document).ready(function () {

   setTimeout(function () {
   $(document).ready(function () {

      $("#containers_gv").dataTable({
        "bJQueryUI": true,
        "bSortClasses": false,
        "sPaginationType": "full_numbers",
        "sDom": '<"#top"fl>rt<"#bottom"ip><"clear">',
        "aoColumns": [
        null,
        { "sSortDataType": "dom-checkbox" },
                { "sSortDataType": "dom-text" },
        { "sSortDataType": "dom-text", "sType": "numeric" },
        { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
            { "sSortDataType": "dom-text" },
                { "sSortDataType": "dom-checkbox" },
                { "sSortDataType": "dom-text" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric" },
                { "sSortDataType": "dom-text", "sType": "numeric"}]
      });

      $('#bottom').appendTo('#gv_controls');
      $('#top').appendTo('#gv_topcontrols');


  }), 1000
});

$(function () {
  $("#containers_gv").prepend($("<thead></thead>").append($(this).find("tr:first"))).dataTable();
});

});

function doSave() {
  var grid = $("#containers_gv");
  var hiddenRows = grid.dataTable().fnGetHiddenNodes();
  $.each(hiddenRows, function () { $(this).css("display", "none").appendTo(grid); });
  return true;
}   

</script>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

护你周全 2024-12-27 14:42:44

问题在于 dataTable 插件完全从 DOM 中删除了其他页面的表格行。从那时起,除当前页面之外的其他页面的文本框不会转发到服务器。您可以从 dataTable 的缓存中获取隐藏行,将它们添加到 GridView 的表中,并在回发之前使用 display: none 样式隐藏。这样他们就可以在服务器上访问。您需要从那里使用 fnGetHiddenNodes API 函数:自定义 API 函数< /a>

下面的完整脚本:

<script type="text/javascript">
     $.fn.dataTableExt.oApi.fnGetHiddenNodes = function (oSettings) {
          /* Note the use of a DataTables 'private' function thought the 'oApi' object */
          var anNodes = this.oApi._fnGetTrNodes(oSettings);
          var anDisplay = $('tbody tr', oSettings.nTable);

          /* Remove nodes which are being displayed */
          for (var i = 0; i < anDisplay.length; i++) {
               var iIndex = jQuery.inArray(anDisplay[i], anNodes);
               if (iIndex != -1) {
                    anNodes.splice(iIndex, 1);
               }
          }

          /* Fire back the array to the caller */
          return anNodes;
     }

     $(function () {
          $("#<%= GridView1.ClientID %>").prepend($("<thead></thead>").append($(this).find("tr:first"))).dataTable();
     });

     function doSave() {
          var grid = $("#<%= GridView1.ClientID %>");
          var hiddenRows = grid.dataTable().fnGetHiddenNodes();
          $.each(hiddenRows, function () { $(this).css("display", "none").appendTo(grid); });
          return true;
     }
</script>

添加:用于保存按钮的 OnClientClick 属性的 doSave 函数:

The problem is that dataTable plugin completely remove table rows for other pages from DOM. Since that, textboxes from other pages except current one not forwarded to server. You can get hidden rows from dataTable's cache, add them to GridView's table and hide with display: none style before postback. This way their are will be accessible on server. You need to use fnGetHiddenNodes API function from there: Custom API functions

The full script below:

<script type="text/javascript">
     $.fn.dataTableExt.oApi.fnGetHiddenNodes = function (oSettings) {
          /* Note the use of a DataTables 'private' function thought the 'oApi' object */
          var anNodes = this.oApi._fnGetTrNodes(oSettings);
          var anDisplay = $('tbody tr', oSettings.nTable);

          /* Remove nodes which are being displayed */
          for (var i = 0; i < anDisplay.length; i++) {
               var iIndex = jQuery.inArray(anDisplay[i], anNodes);
               if (iIndex != -1) {
                    anNodes.splice(iIndex, 1);
               }
          }

          /* Fire back the array to the caller */
          return anNodes;
     }

     $(function () {
          $("#<%= GridView1.ClientID %>").prepend($("<thead></thead>").append($(this).find("tr:first"))).dataTable();
     });

     function doSave() {
          var grid = $("#<%= GridView1.ClientID %>");
          var hiddenRows = grid.dataTable().fnGetHiddenNodes();
          $.each(hiddenRows, function () { $(this).css("display", "none").appendTo(grid); });
          return true;
     }
</script>

Added: doSave function used for Save button's OnClientClick proeprty: <asp:Button runat="server" ID="btnSave" Text="Save" OnClientClick="return doSave()" />

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文