GridView控件常見問題及處理方法

Asp.net 1.1版本中的DataGrid控件用於顯示錶格式的數據,相信你們都用過。Asp.net 2.0版本中GridView控件是DataGrid控件的繼承者,功能比DataGrid加強很多,可是也有不少地方不一樣。下面把使用中發現的不一樣點列舉以下,但願能對你們的工做有所幫助:
 
1.     關於隱藏字段的處理:
DataGrid中咱們通常把不須要顯示又須要在編程中使用的字段在設計期設置爲Visible=False,這樣的字段不會顯示出來,但在綁定數據時會被綁定值,因此咱們能夠經過DataGridItem.Cell[x].Text取到所需數據行的數據。
GridView中直接在設計期設置Visible=False卻不能知足上述需求,由於這樣設置,雖然字段不會被顯示出來了,但數據也沒有被綁定到相應的Cell中,經過GridViewRow.Cell[x].Text取到的全是空字符串,估計應該是控件的Bug。若是想達到上述的效果,能夠經過其它方法實現,只是麻煩一些:
首先,不要設置字段的Visible=False
而後處理RowDataBound事件。
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
   e.Row.Cells[x].Visible = false;
}
 
2.     關於按鈕列的事件:
在DataGrid中,要響應控鈕列中的按鈕點擊事件,能夠處理ItemCommand事件:事件的第一個參數source是object類型的,值爲DataGrid,第二個參數e是DataGridCommandEventArgs類型的,e中包含四個屬性:Item的值爲按鈕所在的行,CommandSource的值爲所點擊的按鈕,CommandName的值爲按鈕在設計期定義的值,CommandArgument的值固定爲空字符串。在使用中,能夠根據Item來區分點擊的是哪一個行中的按鈕,能夠根據CommandName來區分一個行中的多個按鈕。
private void DataGrid1_ItemCommand(object source, DataGridCommandEventArgs e)
{
   ...
}
在GridView中,要響應控鈕列中的按鈕點擊事件,能夠處理RowCommand事件:事件的第一個參數sender是object類型的,值爲GridView,第二個參數e是GridViewCommandEventArgs類型的,e中僅包含三個屬性,比DataGrid控件中的相應事件少了關鍵的Item屬性,CommandSource的值也與DataGrid中的不同,在這裏爲GridView,CommandName的值爲按鈕在設計期定義的值,CommandArgument的值爲被點擊的按鈕所在行的索引。在使用中,能夠根據CommandArgument來區分點擊的是哪一個行中的按鈕,能夠根據CommandName來區分一個行中的多個按鈕。
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        GridViewRow item = this.GridView1.Rows[Convert.ToInt32(e.CommandArgument)];
    }
 
3.     關於按鈕的客戶端提示:
通常狀況下,咱們但願在最終刪除一條數據以前讓用戶進行確認,這個可使用模板列,在模板列中放置按鈕控件,爲按鈕設置客戶端單擊事件。
在Asp.net 1.1中,須要使用編程方法才能爲按鈕指定客戶端單擊事件,方法以下:
<asp:TemplateColumn>
     <ItemTemplate>
         <asp:LinkButton id="LinkButton1" runat="server" CausesValidation="false" CommandName="Test" Text="Button"></asp:LinkButton>
     </ItemTemplate>
</asp:TemplateColumn>
private void DataGrid1_ItemCreated(object sender, DataGridItemEventArgs e)
{
     LinkButton btn = e.Item.FindControl("LinkButton1") as LinkButton;
     if(btn != null)
     {
         btn.Attributes.Add(" confirm('你確認要刪除這條數據嗎?');");
     }
}
在Asp.net 2.0中,方便了許多,能夠在設計期設置OnClientClick屬性來爲按鈕指定客戶端單擊事件,方法以下:
<asp:TemplateField ShowHeader="False">
    <ItemTemplate>
        <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="false" CommandName="Test" Text="按鈕" OnClientClick="return confirm('你確認要刪除這條數據嗎?');"></asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>
 
4.     關於時間字段的格式化輸出:
假如咱們有一個時間字段,數據爲"2005-12-23 10:01:20",想顯示爲"10:01"
在DataGrid中,咱們能夠簡單的設置字段的顯示格式便可,如:
<asp:BoundField DataField="datetime" DataFormatString="{0:HH:mm}" />
在GridView中,相同的方法,卻顯示錯誤,仍顯示爲"2005-12-23 10:01:20",估計是控件的Bug(呵呵,Bug還真很多,微軟這樣的公司發佈的東西也這麼多Bug。可見...),不過,可使用模板列解決此問題,方法以下:
<asp:TemplateField HeaderText="時間">
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server" Text='<%# Bind("datetime", "{0:HH:mm}") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>
 
5.     關於綁定空記錄:
在DataGrid中,咱們能夠把一個包含空記錄的DataSet或DataTable綁定給DataGrid,這樣,呈現時,DataGrid會把數據源中的字段定義以表頭的形式顯示出來。
在GridView控件中,卻不能夠,若是DataSet或DataTable是空記錄。則GridView連表頭都不顯示。只能經過變通的方法實現,稍微有一些麻煩:
    public void BuildNoRecords(GridView gridView, DataSet ds)
    {
        if (ds.Tables[0].Rows.Count == 0)
        {
            ds.Tables[0].Rows.Add(ds.Tables[0].NewRow());
            gridView.DataSource = ds;
            gridView.DataBind();
            int columnCount = gridView.Rows[0].Cells.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 = "No Records Found.";
        }
        else
        {
            gridView.DataSource = ds;
            gridView.DataBind();
        }
    }
6.     關於數據綁定,GridView使用新的數據綁定模式,請參考其它文獻
本文來自CSDN博客,轉載請標明出處:
相關文章
相關標籤/搜索