locked
Comment afficher un contrôle GridView vide RRS feed

  • Discussion générale

  • Lorsqu'il n'y a pas de données pour le contrôle GridView à afficher, par défaut le contrôle n'est pas restitué. Si vous souhaitez afficher les en-têtes même s’il n'y a pas de données, vous pouvez créer un objet DataTable temporaire qui contient un enregistrement vide et ensuite lier le contrôle GridView à la table de données en cas d'initialisation de la page. L'exemple suivant montre comment procéder.

     

    protected void GridView1_Init(Object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Column1");
        dt.Columns.Add("Column2");
        DataRow dr = dt.NewRow();
        dr["Column1"] = "";
        dr["Column2"] = "";
        dt.Rows.Add(dr);
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }

     

     

     

    Une autre solution consiste à hériter de GridView et faire override sur la méthode CreateChildControls. Cette approche peut utiliser automatiquement les colonnes existantes, et elle supprime la nécessité d'utiliser un objet DataTable supplémentaire. L'exemple suivant montre comment procéder.

    public class EmptyGridView : GridView
    {
        #region Properties
        /// <summary>
        /// Activer ou desactiver la generation d'une table vide
        /// </summary>
        [
        Description("Activer ou desactiver la generation d'une table vide."),
        Category("Misc"),
        DefaultValue("true"),
        ]
        public bool ShowEmptyTable
        {
            get
            {
                object o = ViewState["ShowEmptyTable"];
                return (o != null ? (bool)o : true);
            }
            set
            {
                ViewState["ShowEmptyTable"] = value;
            }
        }
        /// <summary>
        /// Texte pour afficher dans la ligne vide
        /// </summary>
        [
        Description("Texte pour afficher dans la ligne vide."),
        Category("Misc"),
        DefaultValue(""),
        ]
        public string EmptyTableRowText
        {
            get
            {
                object o = ViewState["EmptyTableRowText"];
                return (o != null ? o.ToString() : "");
            }
            set
            {
                ViewState["EmptyTableRowText"] = value;
            }
        }
        #endregion
        protected override int CreateChildControls(System.Collections.IEnumerable 
                dataSource, bool dataBinding)
        {
            int numRows = base.CreateChildControls(dataSource, dataBinding);
            if (numRows == 0 && ShowEmptyTable)
            {
                Table table = new Table();
                table.ID = this.ID;
                
                GridViewRow row = base.CreateRow(-1, -1, DataControlRowType.Header, 
                    DataControlRowState.Normal);
                
                DataControlField[] fields = new 
                    DataControlField[this.Columns.Count];
                this.Columns.CopyTo(fields, 0);
                this.InitializeRow(row, fields);
                table.Rows.Add(row);
                
                row = new GridViewRow(-1, -1, DataControlRowType.DataRow,
                   DataControlRowState.Normal);
                TableCell cell = new TableCell();
                cell.ColumnSpan = this.Columns.Count;
                cell.Width = Unit.Percentage(100);
                cell.Controls.Add(new LiteralControl(EmptyTableRowText));
                row.Cells.Add(cell);
                table.Rows.Add(row);
                this.Controls.Add(table);
            }
            return numRows;
        }
    }

     

     

    Pour plusieurs informations, visitez la page Foire aux Questions – ASP.NET

     
     
    Alex Petrescu - MSFT
    mercredi 31 mars 2010 13:08
    Modérateur