2009-12-07 4 views
1

Bonsoir à tous.Problème lié au gridview; résolution jquery en unbind?

J'ai un peu de casse-tête pour vous.

Sur ma page, j'ai un ddl en cascade (ddlBuyer), une recherche de zone de texte (tbxProdAC) et une liste de boutons radio (radTopx). Ceux-ci, une fois peuplés, et un bouton de soumission cliqué, produit une grille de peuplement avec des données. Ce que j'essaye de réaliser est que l'utilisateur peut seulement choisir le ddl, le textbox ou la liste de radiobutton comme méthode pour produire les données gridview. J'ai atteint ce but, en écrivant un peu de syntaxe jquery qui "efface" la grille et réinitialise les différentes méthodes de recherche, par exemple.

<code> 
    ddlBuyer.Attributes.Add("onclick", 
    "$('#tbxProdAC').val(''); 
    $('#txtbxHowMany').val(''); 
    $('#GridView1').remove(); 
    $('#radTopx input').attr('checked',false); 
    $('#radProd').attr('checked', false);"); 
</code> 

Cependant, parce que cela se produit côté client, les événements côté serveur (à savoir ddlBuyer_SelectedIndexChanged) sont encore en cours d'exécution et par la suite, les données sont liées quand je ne veux pas vraiment à. c'est-à-dire que si je sélectionne le bouton radtopx, cliquez sur le bouton pour produire le gridview (ceci se produit sur une publication).

protected void btnSubmit_Click(object sender, EventArgs e) {

if (radTopx.SelectedValue == "" || txtbxHowMany.Text == "") 
    { 
     MessageBox.Show("Please Ensure that BOTH 'The Number of Products' and Appropriate material Is selected Before You Attempt To Run a TOP x Report", "Top x Error!!!", 
      MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     GridView1.DataSourceID = null; 
    } 

    else 
    { 
     int max = 0; 
     if (int.TryParse(txtbxHowMany.Text, out max)) 
     { 

      GridView1.DataSource = this.GetMaterialData(Session["MemberKey"].ToString(), radTopx.SelectedItem.Value, "Primary", max); 
      GridView1.DataSourceID = String.Empty; 
      GridView1.DataBind(); 
     } 
    } 

Je puis cliquez sur ddlBuyer, les informations radTopx est effacé, mais le gridview est retenu comme ce qui suit est tiré:

rotected void ddlBuyer_SelectedIndexChanged(object sender, EventArgs e) { ORDataClassesDataContext dbII = new ORDataClassesDataContext(); var queryII = (from r in dbII.tblOnlineReportingFINALPRODUCTs where r.UnitUserfield1 == ddlBuyer.SelectedValue select new { UnitUserfield2 = r.UnitUserfield2 }).Distinct().OrderBy(r => r.UnitUserfield2);

ddlSub.DataSource = queryII; 
    ddlSub.DataTextField = "UnitUserfield2"; 
    ddlSub.DataValueField = "UnitUserfield2"; 
    ddlSub.DataBind(); 
    ddlSub.Items.Insert(0, "--Choose Sub Category--"); 

    GridView1.DataSourceID = null; 

est-il un moyen de « délier » la grille afficher via jquery de sorte que lorsque ddlBuyer est cliqué, le gridview a publié toutes les données qu'il a pu contenir auparavant? Excuses si cela n'a pas de sens, il est un peu difficile de décrire succinctement et avec précision.

Répondre

0

Sons intéressants MrDean. J'ai eu une expérience similaire en essayant de dissocier des événements qui étaient auparavant liés par quelque chose d'autre et cela peut être un peu un griffeur de nouilles. Sans voir un exemple de ce à quoi ressemblent vos éléments (en HTML), il est difficile de savoir comment ces événements sont liés.

S'ils sont liés en remplissant simplement l'attribut onclick de chaque élément, celui-ci est assez facile à annuler.

$('.myElement').attr('onclick', ''); //Empty out the onclick attribute 
$('.myElement').bind('click', function(){ ... }); //Bind your own function to the click event 

Vous trouverez que c'est une bien meilleure idée de lier votre fonction en utilisant le DOM plutôt que de manipuler les attributs d'éléments individuels. C'est beaucoup plus flexible et vous pouvez en faire beaucoup plus. Maintenant, si vos fonctions d'origine sont liées en utilisant la méthode DOM plutôt que de manipuler l'attribut onclick, les choses deviennent un peu plus compliquées. La première chose que vous pourriez essayer est d'aller:

$('.myElement').unbind(); 

qui fera jQuery délier tous les événements associés à un élément donné. Là où cela devient délicat est de savoir quand appeler unbind(). Si vous le faites sur ready et que l'autre bibliothèque exécute sa fonction ready après la vôtre, alors vous n'avez rien obtenu car les événements n'ont pas encore été liés.

Faites un essai et laissez-moi savoir comment vous allez. A défaut, veuillez télécharger le code HTML de la page que vous essayez de manipuler et je vais jeter un oeil.

Espérons que cela aide!

Vive

Iain

+0

Bonjour Iain. Merci beaucoup d'avoir répondu et d'avoir pris le temps de regarder ce petit scénario pour moi. J'ai effectivement réussi à tromper mon application Web ... lorsqu'un utilisateur sélectionne la liste déroulante, la zone de texte ou la liste des boutons radio, une publication est effectuée. Je viens donc de faire un flic et de lier le gridview à une source de données nulle à ce stade ... donc, quand la page est rafraîchie, rien ne sera présent dans la gridview. Une belle petite triche! Cependant, je vais avoir un jeu avec ce qui précède, car il est très intéressant. Merci encore. – MrDean

+0

Pas de soucis MrDean, merci pour les commentaires :) –

+0

Je reviendrai peut-être vers vous Iain !!! Cela me rend fou encore ... en utilisant ma triche a fait échouer le tri/paging dans mon gridview alors je vais vous donner la méthode un aller. – MrDean