2010-11-08 10 views
0

J'ai une vue de grille qui affiche les entrées d'une table de données. Je donne aux utilisateurs la possibilité de sélectionner un sous-ensemble de données dans le tableau en ayant une zone de texte et un bouton de recherche dans l'en-tête de vue de la grille. Le bouton de recherche déclenche la commande gridview row et modifie la commande select de sqlDataSource sous-jacente, puis ajoute la valeur de texte de la zone de texte en tant que paramètre.Définition de la visibilité du contrôle de bouton dans l'en-tête GridView

Cela fonctionne bien.

En outre, j'ai un bouton "Afficher tout" dans l'en-tête, qui efface les paramètres de sélection, de sorte que toutes les entrées dans le tableau sont affichées. Encore une fois, cela fonctionne parfaitement.

Ce qui ne fonctionne PAS, c'est de contrôler la visibilité du bouton "Afficher tout". Ci-dessous le balisage HTML pour le modèle d'en-tête de grille de données:

<HeaderTemplate> 
    <asp:Button ID="btnShowAll" runat="server" CausesValidation="False" CommandName="ShowAll" Text="Show All" /> 
    <asp:Button ID="btnSearch" runat="server" CausesValidation="True" CommandName="Search" Text="Search" ValidationGroup="vldSearch" /><br /> 
    <asp:TextBox ID="txtSearchName" runat="server"></asp:TextBox>&nbsp; 
    <asp:RequiredFieldValidator ID="vldSearchName" runat="server" ErrorMessage="You have to provide an attorney name to search for." Text="*" ControlToValidate="txtSearchName" ValidationGroup="vldSearch" ForeColor="White"></asp:RequiredFieldValidator> 
</HeaderTemplate> 

Dans le gestionnaire d'événements de commande Row, voici comment je suis en train de la visibilité du bouton:

If Not Me.dgAttorneys.HeaderRow Is Nothing Then 
    Dim btnShowAll As Button = Me.dgAttorneys.HeaderRow.FindControl("btnShowAll") 
    btnShowAll.Visible = Me.sqlAttorneys.SelectParameters.Count > 0 
    Trace.Write("Show all status is " & btnShowAll.Visible.ToString) 
End If 

L'instruction trace montre l'état visible correct - si le bouton "Afficher tout" est cliqué, je fais un SelectParameters.Clear() sur le sqlAttorneys sqlDataSource. Mon problème est dû à une mauvaise compréhension du fonctionnement de la méthode "FindControl" - j'avais supposé que mon nouveau btnShowAll que je définis est en fait une référence au contrôle "physique" sur la page aspx, donc toutes les modifications que je fais mon objet local est reflété dans le contrôle sur la page.

Si ce n'est pas le cas, quelle est la meilleure façon d'obtenir une référence à la commande de bouton dans la rangée d'en-tête de la vue de la grille?

Répondre

0

J'ai réussi à faire fonctionner le comportement du bouton - tout dépendait de l'endroit où, dans le processus global, je réglais la visibilité du bouton. J'ai déplacé ce bloc de code (définissant la visibilité du bouton en fonction de la présence d'un paramètre de recherche) dans l'événement DataBound pour la grille de données, et la visibilité du bouton a été définie comme il se doit. Je suppose que c'est parce que pendant le processus global de liaison de données, basé sur l'état de la vue de grille globale et chaque ligne de grille, l'objet modèle approprié est utilisé pour rendre chaque ligne. Ainsi, toutes les modifications apportées à la propriété visible du bouton ont été remplacées pendant le processus de liaison de données. En déplaçant mon code pour définir la visibilité jusqu'à ce que la liaison de données soit terminée, elle a pris effet.