2010-12-14 5 views
0

J'ai une case à cocher et une zone de texte dans un GridView (pour chaque ligne), et j'aimerais pouvoir écrire du javascript qui activerait et désactiverait la zone de texte en fonction de l'état du case à cocher (cochée ou décochée). Je suppose que je devrais donner à JS l'index des lignes en quelque sorte. Est-ce possible?Désactivation/activation de la zone de texte dans GridViewRow

Répondre

0

Merci pour toutes vos réponses, j'ai travaillé autour de cette question en faisant juste un postback - pas la meilleure méthode, mais en raison de contraintes de temps, il était le choix logique

1

Si vous êtes prêt à utiliser jquery cela peut être très facilement accompli comme suit:

$(document).ready(function() { 

    $('.grid tr').each(function() { 
     var r = $(this); 
     var c = r.find('.check'); 
     var t = r.find('.text'); 
     var f = function(c1, t1) { return function() { 
      if (c1.attr('checked')) { 
       t1.removeAttr('disabled'); 
      } 
      else { 
       t1.attr('disabled', 'disabled'); 
      } 
     }; 
     }; 
     c.click(f(c, t)); // attach click event handler 
     f(c, t); // set initial state 
    }); 
}); 

script ci-dessus est en supposant que la table gridview est décorée de grid classe css et chaque zone de texte et case à cocher sont décorées avec check et text classe css respectivement.

+1

La seule chose que je dois ajouter est de désactiver voir la validation de l'état sur la page asp.net. Parce que vous modifiez l'état des contrôles dans la page, la validation d'état d'affichage va lancer des erreurs. De telles erreurs sont intermittentes et difficiles à déboguer, mais elles sont là. La désactivation de la validation de l'état d'affichage empêche cela et donne à JavaScript la possibilité de modifier les contrôles html du côté client, tout en forçant le côté serveur à ne pas en faire trop. – bleepzter

0


Oui, c'est absolument possible.

Pour mettre en œuvre ce que vous devez faire ce qui suit:

  1. Ecrire une fonction JavaScript générique pour gérer l'activation/désactivation d'une zone de texte en fonction de l'état de la case;
    Exemple: -
    function ManageControlEnabling(sourceCheckBoxId, affectingControlId)
    {
    var sourceCheckBox = document.getElementById(sourceCheckBoxId);
    var affectingControl = document.getElementById(affectingControlId);
    var shouldEnable = false;

    if (sourceCheckBox && affectingControl)
    {
    shouldEnable = sourceCheckBox.checked;

    if(shouldEnable) 
        affectingControl.disabled = false; 
    else 
        affectingControl.disabled = true; 
    

    }
    }

  2. gérer l'événement Row-lié aux données de la grille-View. Implémentez une fonctionnalité similaire dans votre code .Net, pour gérer l'activation/désactivation de la zone de texte (pour chaque ligne) en fonction de l'état de la case à cocher. Et ajoutez également la fonction JavaScript à la case à cocher;
    Exemple: -

    CheckBox checkSource; 
    TextBox textAffecting; 
    
    
    checkSource = e.Row.FindControl("cbSource") as CheckBox; 
    textAffecting = e.Row.FindControl("tbAffecting") as TextBox; 
    
    
    if(checkSource != null) 
    { 
        textAffecting.Enabled = checkSource.Checked; 
    } 
    
    
    checkSource.Attributes.Add("onclick", "ManageControlEnabling('" + checkSource.ClientID + "', '" + textAffecting.ClientID + "', true);"); 
    

S'il vous plaît voir si cela aide.

Merci.

+0

Merci pour votre aide :) Malheureusement cela ne fonctionne pas - la partie rowdatabound fonctionne (elle ajoute les attributs, et la zone de texte est désactivée/activée selon l'état de la case à cocher), mais elle n'activera jamais la zone de texte lorsque je clique même si je sors tous les if et je l'ai juste activé la zone de texte. – Chris

Questions connexes