12
votes

Afficher la page de pied de la grille sur la grille vide?

Je voulais juste savoir quel est le moyen le plus simple et le plus simple d'afficher un pied-de-pied gridview pour la saisie de données, même lorsque la grille est vide?


0 commentaires

6 Réponses :


16
votes

Définissez votre DataSource sur le type d'objet que vous liez à la GridView avec un objet rempli de valeurs vides, puis masquez ce datarow.

EDIT: Puisque vous utilisez un jeu de données ... xxx


2 commentaires

J'utilise un jeu de données, avez-vous un échantillon?


Je me sens comme si c'était une sorte de maladroit mais je courais bas à l'heure, alors ce correctif a fonctionné pour moi. J'ai dû cacher cette ligne "vide" rangée dans la grilleview en ajoutant mygridview.rows [0] .Visible = false.



9
votes

Plus élégamment .. Étendez GridView et ajoutez une propriété ShowFooterWhenempty de manière à ne pas avoir à implémenter du code personnalisé partout.

Imports System.Web.UI.WebControls
Imports System.ComponentModel

Namespace UI.WebControls
Public Class GridViewExtended
    Inherits GridView

    Private _footerRow As GridViewRow

    <DefaultValue(False), Category("Appearance"), Description("Include the footer when the table is empty")> _
    Property ShowFooterWhenEmpty As Boolean

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(False)> _
    Public Overrides ReadOnly Property FooterRow As GridViewRow
        Get
            If (Me._footerRow Is Nothing) Then
                Me.EnsureChildControls()
            End If
            Return Me._footerRow
        End Get
    End Property

    Protected Overrides Function CreateChildControls(ByVal dataSource As System.Collections.IEnumerable, ByVal dataBinding As Boolean) As Integer
        Dim returnVal As Integer = MyBase.CreateChildControls(dataSource, dataBinding)
        If returnVal = 0 AndAlso Me.ShowFooterWhenEmpty Then
            Dim table As Table = Me.Controls.OfType(Of Table)().First
            Me._footerRow = Me.CreateRow(-1, -1, DataControlRowType.Footer, DataControlRowState.Normal, dataBinding, Nothing, Me.Columns.Cast(Of DataControlField).ToArray, table.Rows, Nothing)
            If Not Me.ShowFooter Then
                _footerRow.Visible = False
            End If
        End If
        Return returnVal
    End Function

    Private Overloads Function CreateRow(ByVal rowIndex As Integer, ByVal dataSourceIndex As Integer, ByVal rowType As DataControlRowType, ByVal rowState As DataControlRowState, ByVal dataBind As Boolean, ByVal dataItem As Object, ByVal fields As DataControlField(), ByVal rows As TableRowCollection, ByVal pagedDataSource As PagedDataSource) As GridViewRow
        Dim row As GridViewRow = Me.CreateRow(rowIndex, dataSourceIndex, rowType, rowState)
        Dim e As New GridViewRowEventArgs(row)
        If (rowType <> DataControlRowType.Pager) Then
            Me.InitializeRow(row, fields)
        Else
            Me.InitializePager(row, fields.Length, pagedDataSource)
        End If
        If dataBind Then
            row.DataItem = dataItem
        End If
        Me.OnRowCreated(e)
        rows.Add(row)
        If dataBind Then
            row.DataBind()
            Me.OnRowDataBound(e)
            row.DataItem = Nothing
        End If
        Return row
    End Function

End Class
End Namespace



4
votes

Une autre solution consiste à toujours ajouter une ligne factice dans votre source de données, "Mark" cette rangée avec une valeur spécifique, puis cachez la ligne sur Rowdatabound.

Pour être plus précis, ajoutez la colonne ", 0 comme Dummyrow" à la fin de la clause de sélection de la requête, puis syndical toute la déclaration complète à xxx

une fois que vous avez La requête en place (qui peut être effectuée dans votre objet sqldatasource ou dans votre objet dal, votre code pour la grille ressemblera à ceci comme suit: xxx

Cette solution vient Avec des frais généraux évidents, car ce chèque sera fait pour chaque ligne des résultats, de ne pas mentionner que vous devez modifier votre requête SELECT, mais elle présente également l'avantage de ne pas nécessiter de modifier de manière dynamique le jeu de données (comme dans le premier exemple). et ne nécessitant pas beaucoup de code ou de devoir déployer des bibliothèques de contrôle personnalisées pour votre projet Web.


0 commentaires

1
votes

En tant que note latérale, si vous souhaitez afficher l'en-tête et le pied de page de la grille ou montrez le texte / modèle ELTLEDATA, une fois que vous avez caché la ligne avec le code que j'ai publié ci-dessus, vous pouvez vérifier votre condition et si nécessaire. Supprimer la ligne. Ensuite, le code ressemblera à ceci: XXX

Notez que nous supprimons ici la ligne de Dataitem (nécessaire car sur les post-dos, la grilleview peut redessiner sans ré-datailindinging) et la rangée de la grille elle-même (nécessaire parce que, par ce point, la rangée est déjà dans la garde d'enfants de la grille, que nous ne voulons pas).

Enfin, si le disque maternel caché provoque d'autres problèmes dans votre grille. (Par exemple, mauvaise pagination), vous pouvez utiliser un code similaire pour supprimer votre ligne factice lorsque le gridview a plus de lignes.


0 commentaires

0
votes

Idéalement, vous voulez seulement montrer la ligne factice s'il n'y a pas encore de records dans la table. Alors définissez votre SelectCommand sur quelque chose comme ceci:

Sélectionnez [ID], Prénom, Nom, Email des clients syndicat Sélectionnez 0 [ID], '' FirstName, '' Nom, '' Email où 0 dans (Sélectionnez Compte (1) des clients)

De cette façon si le compte> 0, la ligne factice n'est pas retournée.

Notez que la ligne factice n'a pas de clause de la clause.


0 commentaires

1
votes

Vous pouvez créer une ligne "vide" et la rendre invisible: xxx


0 commentaires