如何讓Gridview在沒有資料的時候顯示錶頭(asp.net)

lingxyd_0發表於2012-12-17

1.前言

當對GridView控制元件進行資料繫結時,如果繫結的記錄為空,網頁上就不顯示GridView,造成頁面部分空白,頁面佈局結構也受影響。下面討論的方法可以讓GridView在沒有資料記錄的時候顯示錶的欄位結構和顯示提示資訊。

2.資料

為了讓GridView顯示資料,在資料庫中建立表temple,其欄位如下:

temple表示廟宇,它的欄位有:

temple_id       int

temple_name   varchar(50)

location   varchar(50)

build_date       datetime

 

temple的資料為:

temple_id

temple_name

location

build_time

1

少林寺

河南省登封市嵩山

1900-2-2 0:00:00

2

大傑寺

五龍山

1933-2-3 3:03:03

3

法源寺

宣武門外教子衚衕南端東側

1941-2-3 5:04:03

4

廣濟寺

阜成門內大街東口

1950-3-3 3:03:03

5

碧雲寺

香山東麓

1963-3-3 3:03:03

 

3.頁面

建立一個asp.net網站工程,在頁面中新增GridView和幾個按鈕,程式碼如下所示:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>GridView繫結記錄為空顯示錶頭測試</title>

</head>

<body>

    <form id="form1" runat="server">

    <div style="font-size:13px;">

    <asp:GridView ID="GridViewEmptyDataTest" runat="server" AutoGenerateColumns="False" EmptyDataText="Data Is Empty" BackColor="White" BorderColor="LightGray" BorderStyle="Double" BorderWidth="3px"

          CellPadding="4" GridLines="Horizontal" Width="500px">

            <Columns>

                <asp:BoundField DataField="temple_id" HeaderText="temple_id" Visible="False" >

                </asp:BoundField>

                <asp:BoundField DataField="temple_name" HeaderText="名稱" >

                    <ItemStyle BorderColor="LightGray" BorderStyle="Double" BorderWidth="1px" Width="100px" />

                </asp:BoundField>

                <asp:BoundField DataField="location" HeaderText="地址" >

                    <ItemStyle BorderColor="LightGray" BorderStyle="Double" BorderWidth="1px" Width="300px" />

                </asp:BoundField>

                <asp:BoundField DataField="build_date" HeaderText="建設時間" >

                    <ItemStyle BorderColor="LightGray" BorderStyle="Double" BorderWidth="1px" Width="100px" />

                </asp:BoundField>

            </Columns>

            <FooterStyle BackColor="White" ForeColor="#333333" />

            <RowStyle BackColor="White" ForeColor="#333333" />

            <SelectedRowStyle BackColor="#339966" Font-Bold="True" ForeColor="White" />

            <PagerStyle BackColor="#336666" ForeColor="White" HorizontalAlign="Center" />

            <HeaderStyle BackColor="CornflowerBlue" Font-Bold="True" ForeColor="White" />

        </asp:GridView>

        <br />

        <asp:Button ID="ButtonHasDataBind" runat="server" Text="有資料繫結" Width="109px"OnClick="ButtonHasDataBind_Click" />

        <asp:Button ID="ButtonQueryEmptyBind" runat="server" Text="查詢結果為空繫結" Width="142px"OnClick="ButtonQueryEmptyBind_Click" />

        <asp:Button ID="ButtonConstructTableBind" runat="server" Text="構造空的DataTable繫結" Width="164px"OnClick="ButtonConstructTableBind_Click" />

        <asp:Button ID="ButtonNormalBind" runat="server" Text="普通空資料繫結" Width="127px"OnClick="ButtonNormalBind_Click" /></div>

    </form>

</body>

</html>

GridView要繫結的欄位和temple的欄位一樣,在這裡我們利用GridView原有的功能,設定當資料為空是顯示“Data Is Empty”,如果沒有設定EmptyDataText屬性,當繫結的記錄為空時,GridView將不在頁面顯示。

4.資料顯示

4.1普通空記錄顯示

編寫ButtonNormalBind的事件函式ButtonNormalBind_Click,新增如下程式碼,來測試沒有經過處理的GridView顯示情況:

protected void ButtonNormalBind_Click(object sender, EventArgs e)

    {

        DataTable dt = new DataTable();

 

        dt.Columns.Add("temple_id");

        dt.Columns.Add("temple_name");

        dt.Columns.Add("location");

        dt.Columns.Add("build_date");

 

        this.GridViewEmptyDataTest.DataSource = dt;

        this.GridViewEmptyDataTest.DataBind();

}

執行這些程式碼後,GridView顯示結果如下圖所示:

 

可以看到這樣簡單的提示看不出GridView的結構來,在大多數的實際應用中我們希望看到GridView到底有哪些欄位。

4.2增加空行來顯示GridView的結構

我們知道只要GridView繫結的DataTable有一行記錄,GridView就會顯示錶頭,所以當DataTable為空時我們增加一個空行從而顯示錶頭。

我們把程式碼改成如下所示:

DataTable dt = new DataTable();

 

        dt.Columns.Add("temple_id");

        dt.Columns.Add("temple_name");

        dt.Columns.Add("location");

        dt.Columns.Add("build_date");

 

        if (dt.Rows.Count == 0)

        {

            dt.Rows.Add(dt.NewRow());

        }

 

        this.GridViewEmptyDataTest.DataSource = dt;

    this.GridViewEmptyDataTest.DataBind();

在每次繫結前判斷,如果為空就增加一空行,這樣繫結的結果如下圖所示:

可以看得表頭已經可以顯示了,但是顯示的空行沒有任何資料也讓人費解,可不可以增加一下提示資訊呢?

4.3增加空記錄提示

我們在資料繫結後增加一些程式碼對GridView進行一下處理,讓顯示結果更友好。在this.GridViewEmptyDataTest.DataBind();後面增加程式碼如下所示:

int columnCount = dt.Columns.Count;

        GridViewEmptyDataTest.Rows[0].Cells.Clear();

        GridViewEmptyDataTest.Rows[0].Cells.Add(new TableCell());

        GridViewEmptyDataTest.Rows[0].Cells[0].ColumnSpan = columnCount;

        GridViewEmptyDataTest.Rows[0].Cells[0].Text = "沒有記錄";

     GridViewEmptyDataTest.Rows[0].Cells[0].Style.Add("text-align""center");

改良後的顯示結果如下圖所示:

看來顯示結果已經達到了我們的要求,但是當頁面上有其他按鈕操作導致頁面PostBack時,頁面再次顯示確沒有了提示資訊變成如下圖所示的樣子:

這並不是我們想要的。

4.4防止PostBack時頁面顯示變化

為了防止顯示改變我們在Page_Load事件裡新增如下程式碼,從而重新繫結GridView:

if (IsPostBack)

        {

            //如果資料為空則重新構造Gridview

            if (GridViewEmptyDataTest.Rows.Count == 1 && GridViewEmptyDataTest.Rows[0].Cells[0].Text == "沒有記錄")

            {

                int columnCount = GridViewEmptyDataTest.Columns.Count;

                GridViewEmptyDataTest.Rows[0].Cells.Clear();

                GridViewEmptyDataTest.Rows[0].Cells.Add(new TableCell());

                GridViewEmptyDataTest.Rows[0].Cells[0].ColumnSpan = columnCount;

                GridViewEmptyDataTest.Rows[0].Cells[0].Text = "沒有記錄";

                GridViewEmptyDataTest.Rows[0].Cells[0].Style.Add("text-align""center");

            }

   }

這下我們的控制元件終於可以按我們的要求顯示了,但是為了程式碼的重用,當一個專案裡有多個GridView時,避免充分些相同的程式碼,我們需要把程式碼封裝成類,從而讓所有的GridView資料繫結時都可以輕易地實現我們的要求。

4.5封裝

類的封裝程式碼如下所示:

using System.Data;

using System.Web.UI.WebControls;

 

/// <summary>

/// Gridview繫結的資料記錄為空時顯示Gridview的表頭,並顯示沒有記錄的提示

/// </summary>

public class GridviewControl

{

    //當Gridview資料為空時顯示的資訊

    private static string EmptyText = "沒有記錄";

 

     public GridviewControl()

     {

        

     }

 

    /// <summary>

    /// 防止PostBack後Gridview不能顯示

    /// </summary>

    /// <param name="gridview"></param>

    public static void ResetGridView(GridView gridview)

    {

        //如果資料為空則重新構造Gridview

        if (gridview.Rows.Count == 1 && gridview.Rows[0].Cells[0].Text == EmptyText)

        {

            int columnCount = gridview.Columns.Count;

            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 GridViewDataBind(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 = table.Columns.Count;

            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");

        }

        else

        {

            //資料不為空直接繫結

            gridview.DataSource = table;

            gridview.DataBind();

        }

 

        //重新繫結取消選擇

        gridview.SelectedIndex = -1;

    }

}

你可以把這個類編譯成DLL,讓各個地方呼叫。

4.6使用示例

這個類的使用很簡單,就是在每次進行資料繫結是呼叫GridViewDataBind,這個函式的第一個引數是要繫結資料的GridView第二個引數是包含資料欄位列的DataTable,可能為空可能不空,如果資料不空,函式則自動進行正常繫結,否則顯示“沒有記錄”的提示。

上面的按鈕事件的程式碼可以改成如下所示:

DataTable dt = new DataTable();

        dt.Columns.Add("temple_id");

        dt.Columns.Add("temple_name");

        dt.Columns.Add("location");

        dt.Columns.Add("build_date");

GridviewControl.GridViewDataBind(this.GridViewEmptyDataTest, dt);

最後在Page_Load中對本頁面所有GridView呼叫ResetGridView函式,如下所示:

if (IsPostBack)

        {

            GridviewControl.ResetGridView(this.GridViewEmptyDataTest);

    }

 

在此提供一個網站測試原始碼,可以按照2中所說的資料表建立test資料庫,並在表中加入相應資料進行測試,記得把連線串改一下哦。

 測試原始碼:http://dl2.csdn.net/down4/20071008/08205401208.rar

5.總結

   MS的asp.net為我們提供了方便好用的控制元件,如果適當地對這些控制元件的使用方法作些小改動就能做出更加完美的效果來。




相關文章