2010-11-09 12 views
0

im en utilisant jqGrid avec asp.net mvc2 ... le problème est que j'appelle une grille sur l'événement clic de bouton .. maintenant toujours si je clique sur le bouton la grille est rechargée mais les boutons d'édition et d'actualisation sont affichés plus d'une fois. Comment résoudre ce problème? est ici l'image alt textplusieurs boutons d'édition et de suppression sur jqGrid recharger

function BindGrid() { 
    if (!firstClick) { 
     $("#list").trigger("reloadGrid"); 
    } 
    firstClick = false; 
    /* Refreshes the grid */ 
    $("#list").jqGrid({ 
     url: '<%= Url.Action("GetScheduleInfo", "TouchSchedule") %>', 
     datatype: 'json', 
     mtype: 'GET', 
     postData: { StartDate: $('#StartDate').val(), EndDate: $('#EndDate').val(), 
        siteId: $('#ListFacility') ? $('#ListFacility').val() : -1 }, 
     colNames: ['SiteID', 'Cal Date', 'Store Open', 'Start Time', 'End Time', 
        'MileageLimit AM', 'MileageLimit PM', 'TouchLimit PM', 
        'TouchLimit AM', 'Total Touches', 'Total Mileage', 'IsWeekend'], 
     colModel: [ 
      { name: 'SiteID', index: 'SiteID', width: 40, align: 'left', 
       /* key: true,*/editable: false, editrules: { edithidden: false }, 
       hidedlg: true, hidden: false }, 
      { name: 'CalDate', index: 'CalDate', width: 100, align: 'left', 
       formatter: 'date', datefmt: 'm/d/Y', editable: true, edittype: 'text', 
       editrules: { required: true, date: true }, 
       formoptions: { elmsuffix: ' *'} }, 
      { name: 'StoreOpen', index: 'StoreOpen', width: 40, align: 'left', 
       editable: true, edittype: 'select', formatter: 'select', 
       editrules: { required: true }, formoptions: { elmsuffix: ' *' }, 
       editoptions: { dataInit: function (elem) { 
       $(elem).empty() 
         .append("<option value='1'>o</option>") 
         .append("<option value='2'>c</option>"); 
       } 
       } }, 
      { name: 'StartTime', index: 'StartTime', width: 100, align: 'left', 
       formatter: 'date', datefmt: 'g:i A', editable: true, edittype: 'text', 
       editrules: { required: true, date: true }, 
       formoptions: { elmsuffix: ' *'} }, 
      { name: 'EndTime', index: 'EndTime', width: 100, align: 'left', 
       formatter: 'date', datefmt: 'g:i A', editable: true, edittype: 'text', 
       editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
      { name: 'MileageLimitAM', index: 'MileageLimitAM', width: 50, 
       align: 'left', editable: true, edittype: 'text', 
       editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
      { name: 'MileageLimitPM', index: 'MileageLimitPM', width: 50, 
       align: 'left', editable: true, edittype: 'text', 
       editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
      { name: 'TouchLimitAM', index: 'TouchLimitAM', width: 50, 
       align: 'left', editable: true, edittype: 'text', 
       editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
      { name: 'TouchLimitPM', index: 'TouchLimitPM', width: 50, 
       align: 'left', editable: true, edittype: 'text', 
       editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
      { name: 'TotalTouches', index: 'TotalTouches', width: 50, 
       align: 'left', editable: true, edittype: 'text', 
       editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
      { name: 'TotalMileage', index: 'TotalMileage', width: 50, 
       align: 'left', editable: true, edittype: 'text', 
       editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
      { name: 'IsWeekend', index: 'IsWeekend', width: 200, 
       align: 'left', editable: false, hidden: false} 
     ], 
     pager: $('#listPager'), 
     rowNum: 10, 
     rowList: [10, 20, 30], 
     sortname: 'CalDate', 
     sortorder: "desc", 
     viewrecords: true, 
     caption: 'Schedule Calendar', 
     autowidth: true, 
     afterInsertRow: function (rowid, rowdata) { 
      if (rowdata.IsWeekend) 
       $(this).jqGrid('setRowData', rowid, false, { color: 'blue' }); 
     } 
    }).navGrid('#listPager', 
       { edit:true, add:false, del:false, search:false, refresh:true }); 

} 

Répondre

1

Vous devez créer la grille avec $("#list").jqGrid({...}) et ajoutez les boutons du navigateur avec navGridune seule fois. Je suppose que votre BindGrid fonction sera appelée deux fois dans votre programme, de sorte que vous avez tous les boutons deux fois. Vous pouvez facilement vérifier cela en ajoutant un alert("in BindGrid"); supplémentaire à l'intérieur de la fonction BindGrid.

MISE À JOUR: Je lis votre code et voici ma suggestion:

<script type="text/javascript"> 
//<![CDATA[ 
    $(document).ready(function() { 
     $("#StartDate").datepicker({ 
      changeMonth: false, 
      changeYear: false 
     }); 
     $("#EndDate").datepicker(); 

     var checkMileageLimit = function(value, colname) { 
      alert($("#TotalMileage").val()); 
      if (value > $("#TotalMileage").val()) { 
       alert(false); 
       return ["false", "value shuld be less"]; 
      } else { 
       alert(true); 
       return ["true",""]; 
      } 
     }; 

     $("#list").jqGrid({ 
      url: '<%= Url.Action("GetScheduleInfo", "TouchSchedule") %>', 
      datatype: 'json', 
      mtype: 'GET', 
      postData: { 
       StartDate: function() { return $('#StartDate').val(); }, 
       EndDate: function() { return $('#EndDate').val(); }, 
       siteId: function() { return $('#ListFacility') ? $('#ListFacility').val() : -1; } 
      }, 
      colNames: ['SiteID', 'Cal Date', 'Store Open', 'Start Time', 'End Time', 
         'MileageLimit AM', 'MileageLimit PM', 'TouchLimit PM', 
         'TouchLimit AM', 'Total Touches', 'Total Mileage', 'WeekDay'], 
      colModel: [ 
       { name: 'SiteID', index: 'SiteID', width: 40, /* key: true,*/editable: false, editrules: { edithidden: false }, hidedlg: true, hidden: false }, 
       { name: 'CalDate', index: 'CalDate', width: 100, formatter: 'date', datefmt: 'm/d/Y', editable: true, edittype: 'text', editrules: { required: true, date: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'StoreOpen', index: 'StoreOpen', width: 40, editable: true, edittype: 'select', formatter: 'select', editrules: { required: true }, formoptions: { elmsuffix: ' *' }, editoptions: { value: { o: 'Open', c: 'closed'}} }, 
       { name: 'StartTime', index: 'StartTime', width: 100, editable: true, formatter: 'date', masks: 'ShortTime', edittype: 'text', editrules: { time: true, required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'EndTime', index: 'EndTime', width: 100, editable: true, edittype: 'text', editrules: { time: true, required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'MileageLimitAM', index: 'MileageLimitAM', width: 50, editable: true, 
        edittype: 'text', editrules: { custom: true, custom_func: checkMileageLimit, 
        required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'MileageLimitPM', index: 'MileageLimitPM', width: 50, editable: true, edittype: 'text', editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'TouchLimitAM', index: 'TouchLimitAM', width: 50, editable: true, edittype: 'text', editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'TouchLimitPM', index: 'TouchLimitPM', width: 50, editable: true, edittype: 'text', editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'TotalTouches', index: 'TotalTouches', width: 50, editable: true, edittype: 'text', editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'TotalMileage', index: 'TotalMileage', width: 50, editable: true, edittype: 'text', editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'WeekDay', index: 'WeekDay', width: 200, editable: false, hidden: false} 
      ], 
      pager: $('#listPager'), 
      rowNum: 10, 
      rowList: [10, 20, 30], 
      sortname: 'CalDate', 
      sortorder: "desc", 
      viewrecords: true, 
      caption: 'Schedule Calendar', 
      autowidth: false, 
      afterInsertRow: function (rowid, rowdata) { 
       if (rowdata.IsWeekend) { 
        $(this).jqGrid('setRowData', rowid, false, { color: 'blue' }); 
       } 
      } 
     }).navGrid('#listPager', 
        { edit: true, add: false, del: false, search: false, refresh: true } 
     ); 

     $('#btnSubmit').click(function() { 
      $("#list").trigger("reloadGrid"); 
     }); 
    }); 
//]]> 
</script> 

Je vous recommande d'utiliser postData propriétés comme des fonctions, puis à chaque rafraîchissement sera appelée la fonction et vous pouvez obtenir les valeurs réelles des contrôles HTML correspondants. Vous pouvez en savoir plus sur la technique au my old answer. D'autres petits changements vous trouverez probablement vous-même.

De plus, la déclaration

$('#ListFacility') ? $('#ListFacility').val() : -1; 

semble incorrect pour moi parce que $('#ListFacility') sera toujours un objet. Parce que vous ne postez pas et le code HTML, je ne pouvais pas le réparer. Vous devriez le faire vous-même.

En outre, il peut être que vous aurez de meilleures performances dans votre grille si vous allez utiliser gridview:true et définir la couleur à l'intérieur de la fonction loadComplete au lieu de l'utilisation de la fonction afterInsertRow. Voir this old answer comme exemple et description de l'option gridview.

+0

oui ... ceci est appelé à chaque fois que l'on clique sur le bouton .. y a-t-il un meilleur moyen de charger la grille en cliquant sur un bouton ou d'une façon quelconque pour éviter que le navgrid soit rendu deux fois? – Rakesh

+0

@Rakesh: vous devez créer jqGrid une fois (au même endroit où vous définissez $ ("# list"). JqGrid ({...}). JqGrid ('navGrid', ...); $ ("# yourButton "). bind ('click', function() {/ ** /)); A l'intérieur du handle de l'événement click, vous devez appeler uniquement $ ("# list"). Trigger ("reloadGrid"); 'et rien de plus. Si la description ne vous aide pas à résoudre le problème, vous devriez ajouter votre question avec du code JavaScript plus complet, puis je vais le modifier et coller le code fixe dans ma réponse. – Oleg

+0

s'il vous plaît lire la mise à jour ci-dessous .. :) – Rakesh

0

Merci pour votre réponse ... cela a fonctionné j'ai placé un si autre dans le bouton cliquez pour vérifier si c'est un premier clic ou clics suivants et puis cela a fonctionné ... mais quand j'appelle reloadgrid je vois toujours la même vieux parmaeters sont transmis au contrôleur .. ther sont et textboxes dropdowns dont les valeurs modifications, puis je clique sur le bouton d'envoi qui recharge la grille .. im en utilisant le paramètre postData pour transmettre des valeurs supplémentaires au contrôleur

<script type="text/javascript"> 
    var firstClick = true; 
    $(document).ready(function() { 
     $("#StartDate").datepicker({ 
      changeMonth: false, 
      changeYear: false 
     }); 
     $("#EndDate").datepicker(); 

     var updateDialog = { 
      url: '<%= Url.Action("UpdateGrid", "TouchSchedule") %>' 
      , closeAfterAdd: true 
      , closeAfterEdit: true 

     }; 


     $('#btnSubmit').click(function() { 
      $("#list").clearGridData(); 
      if (!firstClick) { 
       alert($('#ListFacility').val()); 
       $("#list").trigger("reloadGrid"); 


      } 
      else { 
       firstClick = false; 
       /* Refreshes the grid */ 

       $("#list").jqGrid({ 
        url: '<%= Url.Action("GetScheduleInfo", "TouchSchedule") %>', 
        datatype: 'json', 
        mtype: 'GET', 
        postData: { StartDate: $('#StartDate').val(), EndDate: $('#EndDate').val(), siteId: $('#ListFacility') ? $('#ListFacility').val() : -1 }, 
        colNames: ['SiteID', 'Cal Date', 'Store Open', 'Start Time', 'End Time', 'MileageLimit AM', 'MileageLimit PM', 'TouchLimit PM', 'TouchLimit AM', 'Total Touches', 'Total Mileage', 'WeekDay'], 
        colModel: [ 
       { name: 'SiteID', index: 'SiteID', width: 40, align: 'left', /* key: true,*/editable: false, editrules: { edithidden: false }, hidedlg: true, hidden: false }, 
       { name: 'CalDate', index: 'CalDate', width: 100, align: 'left', formatter: 'date', datefmt: 'm/d/Y', editable: true, edittype: 'text', editrules: { required: true, date: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'StoreOpen', index: 'StoreOpen', width: 40, align: 'left', editable: true, edittype: 'select', formatter: 'select', editrules: { required: true }, formoptions: { elmsuffix: ' *' }, editoptions: { value: { o: 'Open', c: 'closed'}} }, 
       { name: 'StartTime', index: 'StartTime', width: 100, align: 'left', editable: true, formatter: 'date', masks: 'ShortTime', edittype: 'text', editrules: { time: true, required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'EndTime', index: 'EndTime', width: 100, align: 'left', editable: true, edittype: 'text', editrules: { time: true, required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'MileageLimitAM', index: 'MileageLimitAM', width: 50, align: 'left', editable: true, edittype: 'text', editrules: { custom: true, custom_func: CheckMileageLimit, required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'MileageLimitPM', index: 'MileageLimitPM', width: 50, align: 'left', editable: true, edittype: 'text', editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'TouchLimitAM', index: 'TouchLimitAM', width: 50, align: 'left', editable: true, edittype: 'text', editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'TouchLimitPM', index: 'TouchLimitPM', width: 50, align: 'left', editable: true, edittype: 'text', editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'TotalTouches', index: 'TotalTouches', width: 50, align: 'left', editable: true, edittype: 'text', editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'TotalMileage', index: 'TotalMileage', width: 50, align: 'left', editable: true, edittype: 'text', editrules: { required: true }, formoptions: { elmsuffix: ' *'} }, 
       { name: 'WeekDay', index: 'WeekDay', width: 200, align: 'left', editable: false, hidden: false}], 

        pager: $('#listPager'), 
        rowNum: 10, 
        rowList: [10, 20, 30], 
        sortname: 'CalDate', 
        sortorder: "desc", 
        viewrecords: true, 
        caption: 'Schedule Calendar', 
        autowidth: false, 
        afterInsertRow: function (rowid, rowdata) { 
         if (rowdata.IsWeekend) 
          $(this).jqGrid('setRowData', rowid, false, { color: 'blue' }); 
        } 


       }).navGrid('#listPager', 
      { 
       edit: true, add: false, del: false, search: false, refresh: true 
      } 

     ); 
      } 

     }); 



    }); 

    function CheckMileageLimit(value, colname) 
    { 
     alert($("#TotalMileage").val()); 
     if (value > $("#TotalMileage").val()) 
     { 
      alert(false); 
      return ["false", "value shuld be less"]; 
      } 
     else 
     { 
      alert(true); 
      return ["true",""];} 
      } 
</script>