Kennt jemand eine Möglichkeit, eine Spalte in einer asp.net Listenansicht zu verstecken?

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

  •  09-06-2019
  •  | 
  •  

Frage

Ich weiß, Sie können <% if%> put-Anweisungen in den ItemTemplate Kontrollen zu verstecken, aber die Spalte ist immer noch da. Sie können nicht <%%> Aussagen in die Layouttemplate gesetzt, die ist, wo die Spaltenüberschriften erklärt werden, damit das Problem. Kennt jemand einen besseren Weg?

War es hilfreich?

Lösung

Hier ist eine andere Lösung, die ich gerade tat, zu sehen, dass ich verstehe, was Sie tun möchten:

Hier ist Ihr 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" />

Hier ist der Code hinter

/// <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;
}

Tu, was du in der Databound wollen. Da die Spalte ist jetzt Runat Server, und Sie Umgang mit dem Databound der Kontrolle, wenn Sie ListView1.FindControl ( „tdIsSuperCool“) zu tun sind Sie in der Layout-Vorlage, so dass wie ein Weltmeister arbeitet.

setzen, was Business-Logik, die Sie die Sichtbarkeit des td steuern möchten und Sie sind gut.

Andere Tipps

Versuchen Sie, ein Panel verwenden, und Sie können es einschalten / Aus

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

Das Listview gibt Ihnen die volle Kontrolle darüber, wie die Daten an den Client gerendert wird. Sie haben die Layoutvorlage angeben, und einen Platzhalter geben, die werden, wo jedes Element injiziert wird.

Der Ausgang der unten werden Sie eine Tabelle, und jedes Element wird eine neue TR sein.

Beachten Sie die Verwendung von runat = 'Server' und 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>

Ich weiß, es ist eine sehr alte Frage, aber ich habe tatsächlich, dies zu tun und ich denke, eine ziemlich nette Weise fand es durch jQuery und CSS zu tun.

Fügen Sie die folgenden Header:

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

Für alle Spalten, die Sie ausblenden möchten, fügen Sie eine benutzerdefinierte Eigenschaft zum td / th.

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

Ich rate eine benutzerdefinierte Eigenschaft zu verwenden, da, lange Geschichte kurz, kann es ein paar Fliegen mit einer Klappe schlagen. Sie werden nicht einmal den Wert für jede Spalte ändern müssen, wie würden Sie, wenn wir dies auf der ID-Eigenschaft basiert.

Als nächstes stellen Sie sicher, ein verstecktes Feld haben, die Ihnen sagt, wissen lässt, ob die Spalte verbergen. Dies kann ein asp sein. Hidden oder andere so lange, wie es auf dem Formular ist

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

Schließlich, am unteren Rand der Seite, zu tun:

        <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>

Sie können immer die Spaltenbreite auf 0 (Null) gesetzt, wenn Sie nicht einen besseren Weg finden.

Die Listenansicht nicht wirklich einen Begriff der ‚Säule‘ hat, da es beabsichtigt ist, nur zu sein, na ja, eine Liste.

Ich gehe davon aus, dass Sie die Datenbindung verwenden, um eine Liste von ‚Somethings‘ zur Listenansicht zu befestigen. Wenn das der Fall ist, dann werden Sie nur eine Liste von Elementen haben und die HTML im Layouttemplate wird entscheiden, wie diese Elemente angezeigt werden. Wenn Sie dann einen Tabelle Stil Array von Spalten und Zeilen dann vielleicht ein Datagrid über das Erstellen wäre eine bessere Wahl sein, da dies gibt viel mehr programmatische Steuerung von bestimmten Spalten im Gespräch sind.

Es kann sein, dass Sie hoffen, das Tabellenlayout vollständig durch CSS zu schaffen, das ist eine bewundernswerte Entscheidung , wenn ist rein für Layoutzwecke. Jedoch Ihre Anforderung speziell eine Spalte verstecken zeigt mir, dass eine Tabelle besser platziert Ihre Bedürfnisse anzupassen. Es ist in Ordnung Tabellen für tabellarische Daten zu verwenden ... IMHO ...

Wenn Sie wirklich ein Listview zu verwenden, brauchen dann könnte man immer versuchen, die Bindung an etwas in Ihren Daten, die bestimmt, ob ein Element angezeigt werden soll oder nicht, z.

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

Fügen Sie diesen Code im HTML-Element, das Sie steuern möchten (in der Layouttemplate). Dann in dem Objekt, das Sie Sie sind verbindlich würde eine Eigenschaft ‚Displaystyle‘ müssen, die entweder wurde auf ‚Block‘ oder ‚keine‘.

Um die Layout-Vorlage Spaltenüberschrift Text zugreifen, habe ich sie in der Vorlage Etiketten, und hat einen Findcontrol im Prerender der Listenansicht, machte dann die Etiketten leeren Text, wenn die Spalte „aus“ sein sollte. Dies könnte nicht für Ihre Absichten arbeiten, aber für mich wollte ich noch der Säulenraum verwendet werden soll, nur leer angezeigt.

Je weiter man versuchen, eine Listenansicht Biegung zu machen über rückwärts, desto mehr werden Sie wünschen Sie ein Raster verwendet statt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top