扩展GridView实现无数据处理

提出需求

GridView控件在开发后台管理的时候非常方便快速,但是要实现没有数据时显示“没有数据”,并居中,是一件比较麻烦的事情,这里在一个公开的方法里实现了绑定List<T>和DataTable时,如果没有记录显示“没有数据”和表头。

显示效果

实现代码

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.UI.WebControls;

/// <summary>
/// ControlExtension 的摘要说明
/// </summary>
public class ControlExtension
{
    public ControlExtension()
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }

    private static string EmptyText = "没有记录";

    /// <summary>
    /// 防止PostBack后Gridview不能显示
    /// </summary>
    /// <param name="gridview"></param>
    private static void ResetGridView(GridView gridview)
    {
        //如果数据为空则重新构造Gridview
        if (gridview.Rows.Count == 1 && gridview.Rows[0].Cells[0].Text == EmptyText)
        {
            int columnCount = gridview.Columns.Count;
            InitGridView(gridview, columnCount);
        }
    }

    private static void InitGridView(GridView gridview, int columnCount)
    {
        gridview.Rows[0].Cells.Clear();
        gridview.Rows[0].Cells.Add(new TableCell());
        gridview.Rows[0].Cells[0].ColumnSpan = columnCount;
        gridview.Rows[0].Cells[0].Text = EmptyText;
        gridview.Rows[0].Cells[0].Style.Add("text-align", "center");
    }

    /// <summary>
    /// 绑定数据到GridView,当表格数据为空时显示表头
    /// </summary>
    /// <param name="gridview"></param>
    /// <param name="table"></param>
    public static void GridViewBind(GridView gridview, DataTable table)
    {
        //记录为空重新构造Gridview
        if (table.Rows.Count == 0)
        {
            table = table.Clone();
            table.Rows.Add(table.NewRow());
            gridview.DataSource = table;
            gridview.DataBind();
            int columnCount = gridview.Columns.Count;
            InitGridView(gridview, columnCount);
        }
        else
        {
            //数据不为空直接绑定
            gridview.DataSource = table;
            gridview.DataBind();
        }

        //重新绑定取消选择
        gridview.SelectedIndex = -1;
    }

    public static void GridViewBind<T>(GridView gridview, List<T> list)
    {
        //记录为空重新构造Gridview
        if (list.Count == 0)
        {
            DataTable table = new DataTable();
            DataRow dr = table.NewRow();
            Type type = typeof(T);
            foreach (PropertyInfo p in type.GetProperties())
            {

                DataColumn dc = new DataColumn(p.Name);
                table.Columns.Add(dc);
            }
            table.Rows.Add(table.NewRow());
            gridview.DataSource = table;
            gridview.DataBind();
            int columnCount = gridview.Columns.Count;
            InitGridView(gridview, columnCount);
        }
        else
        {
            //数据不为空直接绑定
            gridview.DataSource = list;
            gridview.DataBind();
        }

        //重新绑定取消选择
        gridview.SelectedIndex = -1;
    }

}

调用代码

ControlExtension.GridViewBind<Apis>(this.GridView1, list);

更简单的办法

其实有更简单的方法,刚刚发现,代码如下,应该要Net4.0才支持。

        this.GridView1.ShowHeaderWhenEmpty = true;
        this.GridView1.EmptyDataText = "没有记录";
原文地址:https://www.cnblogs.com/shya/p/4415709.html