2014年3月16日 星期日

[ASP.NET]如何只顯示自定義GridView的欄位

最近遇到一個需求

就是要使用GridView的某些欄位建立出新欄位的資料

但這些資料來源的欄位又不出現在畫面上

資料來源是DataSet

關於這個問題目前想到有三個解法

第一個就是在資料庫Select時就完成過濾產生新資料行的動作

第二個方法是在DataSet或DataTable的物件中就處裡table內容

然後再輸出給GridView

最後一個解法就是資料列顯示在GridView的時候處裡

之後我是選擇第三的方法

因為最直接我掌控度也比較高

不過用這方法有遇到我預料之外的事

範例程式碼如下

這個範例的總平均欄位是由國文成績跟數學成績計算出來非原來table的內容

<asp:gridview autogeneratecolumns="true" id="GridView1" onrowdatabound="GridView1_RowDataBound" runat="server">
        <columns>
            <asp:boundfield datafield="student_id" headertext="學號" sortexpression="student_id">
            <asp:boundfield datafield="city" headertext="居住地" sortexpression="city">
            <asp:boundfield datafield="chinese" headertext="國文成績" sortexpression="chinese">
            <asp:boundfield datafield="math" headertext="數學成績" sortexpression="math">
            <asp:templatefield headertext="總平均">
                <itemtemplate>
                    <asp:label id="AVG" runat="server" text=""></asp:label>
                </itemtemplate>
            </asp:templatefield>
        </asp:boundfield></asp:boundfield></asp:boundfield></asp:boundfield></columns>
</asp:gridview>

顯示出來的結果是這樣


本來我預期撰寫上面程式碼的內容應該只有出現紅色框框外的自訂義內容

但是原來table中的內容還是跟著一起出現

後來找到不到問題在哪裡時我是先用Visible將欄位隱藏來解決

protected void Rate_RowDataBound(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[5].Visible = false;
    e.Row.Cells[6].Visible = false;
    e.Row.Cells[7].Visible = false;
    e.Row.Cells[8].Visible = false;
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        Label AVG = e.Row.FindControl("AVG") as Label;
        AVG.Text = ((Convert.ToDouble(e.Row.Cells[2].Text) + Convert.ToDouble(e.Row.Cells[3].Text)) / 2).ToString();
    }
}

當然這個方法看起來並不是很理想應該有更簡明的方式

後來回來仔細想了網路上人家提供的一個方法

就是將GridView的AutoGenerateColumns屬性設成false

依據MSDN上的敘述

取得或設定值,指出是否自動建立資料來源中每個欄位的繫結欄位。

簡單說就是你把DataSet、DataTable指派給GridView的DataSource後

他就不會自動幫你在頁面上顯示出Table內容

你設成false之後就只會顯示你自己定義的欄位內容了

沒有留言:

張貼留言