Est-ce que quelqu'un connaît un moyen de cacher une colonne dans une listview asp.net?

StackOverflow https://stackoverflow.com/questions/70758

  •  09-06-2019
  •  | 
  •  

Question

Je sais que vous pouvez mettre <% if% > instructions dans ItemTemplate pour masquer les contrôles mais la colonne est toujours là. Vous ne pouvez pas mettre & Lt;%% & Gt; instructions dans le LayoutTemplate qui est l'endroit où les en-têtes de colonne sont déclarés, d'où le problème. Est-ce que quelqu'un connaît un meilleur moyen?

Était-ce utile?

La solution

Voici une autre solution que je viens de faire, car je comprends ce que vous voulez faire:

Voici votre ASCX / ASPX

    <asp:ListView ID="ListView1" runat="server" DataSourceID="MyDataSource" ItemPlaceholderID="itemPlaceHolder" OnDataBound="ListView1_DataBound">
        <LayoutTemplate>
            <table border="1">
                <tr>
                    <td>Name</td>
                    <td>Age</td>
                    <td runat="server" id="tdIsSuperCool">IsSuperCool</td>
                </tr>
                <asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
            </table>
        </LayoutTemplate>
        <ItemTemplate>
            <tr>
                <td><%# Eval("Name") %></td>
                <td><%# Eval("Age") %></td>
                <td runat="server" id="myCol" visible='<%# (bool)Eval("IsSuperCool") %>'>true</td>
            </tr>
        </ItemTemplate>
    </asp:ListView>
    <asp:ObjectDataSource 
        ID="MyDataSource" 
        runat="server" 
        DataObjectTypeName="BusinessLogicLayer.Thing" 
        SelectMethod="SelectThings"
        TypeName="BusinessLogicLayer.MyObjectDataSource" />

Voici le code derrière

/// <summary>
/// Handles the DataBound event of the ListView1 control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void ListView1_DataBound(object sender, EventArgs e)
{
    ListView1.FindControl("tdIsSuperCool").Visible = false;
}

Faites ce que vous voulez dans le databound. Comme la colonne est maintenant un serveur d'exécution et que vous gérez le DataBound du contrôle, lorsque vous utilisez ListView1.FindControl (& "; TdIsSuperCool &"), Vous vous trouvez dans le modèle de mise en page champion.

Indiquez la logique métier pour laquelle vous souhaitez contrôler la visibilité du td et vous êtes performant.

Autres conseils

Essayez d’utiliser un panneau et vous pouvez l’activer / le désactiver

 foreach (ListViewItem item in ListView1.Items)
 {
     ((Panel)item.FindControl("myPanel")).Visible= False;
 }

ListView vous donne un contrôle total sur la manière dont les données sont rendues au client. Vous spécifiez le modèle de présentation et indiquez un espace réservé à l'endroit où chaque élément est injecté.

Le résultat ci-dessous vous donnera un tableau et chaque élément sera un nouveau TR.

Notez l'utilisation de runat = 'serveur' et visible ='<%# %>'

<asp:ListView ID="ListView1" runat="server" DataSourceID="MyDataSource" ItemPlaceholderID="itemPlaceHolder">
    <LayoutTemplate>
        <table>
            <asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
        </table>
    </LayoutTemplate>
    <ItemTemplate>
        <tr>
            <td runat="server" id="myCol" visible='<%# (bool)Eval("IsSuperCool") %>'>
                <%# Eval("SuperCoolIcon") %>
            </td>
            <td>
                <%# Eval("Name") %>
            </td>
            <td>
                <%# Eval("Age") %>
            </td>
        </tr>
    </ItemTemplate>
</asp:ListView>

Je sais que c'est une très vieille question, mais je dois en fait le faire et je pense avoir trouvé un moyen assez agréable de le faire par le biais de jQuery et de CSS.

Ajoutez les éléments suivants à l'en-tête:

<script type="text/javascript" src="Scripts/jquery-1.7.1.min.js" ></script>
  <style>
    .hide {
      display:none;
    }
    .show {
      display:block;
    }
  </style>

Pour toutes les colonnes que vous souhaitez masquer, ajoutez une propriété personnalisée au td / th.

<th runat="server" data-prop='authcheck'  id="tdcommentsHeader"  >Comments</th>

Je vous conseille d'utiliser une propriété personnalisée car, bref, elle peut tuer un groupe d'oiseaux avec une pierre. Vous n'aurez même pas besoin de changer la valeur de chaque colonne, comme si vous vous basiez sur la propriété id.

Ensuite, assurez-vous que vous avez un champ caché qui vous indique si vous souhaitez ou non masquer la colonne. Cela peut être un asp: HiddenField ou tout autre tant que c'est sur le formulaire.

<asp:HiddenField runat="server" ID="IsAuthorized" Value="false" />

Enfin, au bas de la page, faites:

        <script type="text/javascript">
          $(document).ready(function () {
            var isauth = $("[id='IsAuthorized']").val();
              if (isauth==="false") {
              $("[data-prop='authcheck']").addClass('hide');
              //$("[id*='tdcomments']").addClass('hide'); 
            }
          });
      </script>

Vous pouvez toujours définir la largeur de la colonne sur 0 (zéro) si vous ne trouvez pas de meilleure solution.

La listview n'a pas vraiment de concept de "colonne" car elle est simplement destinée à être une liste.

Je vais supposer que vous utilisez la liaison de données pour attacher une liste de "quelque chose" à ListView. Si tel est le cas, vous aurez juste une liste d'éléments et le code HTML dans LayoutTemplate décidera de la façon dont ces éléments sont affichés. Si vous envisagez ensuite de créer un tableau de colonnes et de lignes de style tableau, un DataGrid serait peut-être un meilleur choix, car cela offre un contrôle beaucoup plus programmatique de colonnes spécifiques.

Il se peut que vous souhaitiez créer la mise en page du tableau entièrement via CSS, ce qui est une décision admirable si il ne s'agit que d'une mise en page. Cependant, votre exigence de masquer une colonne en particulier m'indique qu'une table est mieux placée pour répondre à vos besoins. C’est bien d’utiliser des tableaux pour les données tabulaires ... IMHO ...

Si vous avez vraiment besoin d'utiliser un ListView, vous pouvez toujours essayer de lier quelque chose dans vos données qui détermine si un élément doit être affiché ou non, par exemple:

.
style='display: <%#Eval("DisplayStyle") %>;'

Placez ce code dans l'élément html que vous souhaitez contrôler (dans LayoutTemplate). Ensuite, dans l'objet que vous liez, vous aurez besoin d'une propriété "DisplayStyle" qui a été définie sur "bloquer" ou sur "aucune".

Pour accéder au texte de l'en-tête de colonne du modèle de présentation, je leur ai créé des libellés, puis un contrôle de recherche dans le préfixe de la liste, puis le libellé est vide si la colonne doit être " off quot ;. Cela ne fonctionnera peut-être pas pour vos intentions, mais pour moi, je voulais tout de même utiliser l’espace réservé aux colonnes.

Plus vous irez loin dans une vue liste, plus vous souhaiterez utiliser une grille.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top