GridView

出自ProgWiki
跳至導覽 跳至搜尋

GridViewSystem.Web.UI.WebControls.GridView

匯出

匯出成Execl

  • 程式碼
this.Response.Clear();
{
	using (System.IO.StringWriter sw = new System.IO.StringWriter())
	{
		using (HtmlTextWriter hw = new HtmlTextWriter(sw))
		{
			string strToday = DateTime.Now.ToString("d");
			this.Response.ContentType = "application/x-msexcel";
			this.Response.AddHeader("content-disposition", "attachment; filename=" + strToday + ".xls");
 
			this.GridView1.RenderControl(hw);
			this.Response.Write(sw.ToString());
		}
	}
}
this.Response.End();
  • 必要函數(不然 this.GridView1.RenderControl(hw); 會彈出錯誤)
//必須覆寫 Page.VerifyRenderingInServerForm 
public override void VerifyRenderingInServerForm(Control control)
{
}

其他轉資料到Execl的方法

滑鼠點選資料列, 快速進入編輯模式

  • GridView1 需使用 RowDataBound 事件處理函數
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
	//標題列時, e.Row.RowIndex 則為 -1, 其他資料列的 e.Row.RowIndex 則從1開始增值
	if (e.Row.RowIndex != -1)
	{
		for (int i = 1; i < e.Row.Cells.Count; i++)
		{
			//onclick="javascript:__doPostBack('GridView1','Edit$1')"
 
			e.Row.Cells[i].Attributes["onclick"] = string.Format(
				"javascript:__doPostBack('GridView1','Edit${0}')",
				 e.Row.RowIndex );
			//style="cursor:hand" 在FireFox下不可用,應改為 style="cursor:pointer"
			e.Row.Cells[i].Style["cursor"] = "pointer";
		}
	}
}


GridView分頁效果

GridView分頁效果(1)

用法:

  1. 先下載它的範例[1]
  2. 解壓縮後,把它的範例裡的檔案 GridViewWithPager.cs 與 PagerLinkButton.cs 複製到你的網站的 App_Code 目錄裡。
  3. 在你的.aspx 頁面中加入相關的CSS定義(參照它的Default.aspx)。
  4. 在你的.aspx 頁面上,加入 <%@ Register Namespace="App_Code" TagPrefix="ac" %>
  5. 在你的.aspx 頁面上把 <asp:GridView 與 </asp:GridView> 分別置換為 <ac:GridViewWithPager UseCustomPager="true" 與 </ac:GridViewWithPager>

自訂版本:

GridView分頁效果(2)

GridView分頁效果(其他)

滑鼠在資料列上移動時, 資料列改變底色

FAQ

為什麼在 GridView 裡所設定的 DataFormatString 沒有效?

  • 在 GridView 控制項的各個 BoundField 資料行設定了 DataFormatString 屬性之後,必須將 BoundField 資料行的 HtmlEncode 屬性設定成 False。

發怖到遠端的IIS時,原本GridView的各行的【編輯】超連結,變成【Edit】

  • 需在那台的Windows安裝 .NetFramework 對應版本的繁體中文語言套件。

自動編號欄位

欄位內容不斷行

  • 標題列用
<HeaderStyle Wrap="False" />
  • 資料列用
<ItemStyle Wrap="False" /> 

在GridView下的Footer列加入合計的計算

多行檔頭

重複內容的欄位,垂直合併

在資料列上自訂按鈕

資料欄依條件變色

呈現RSS內容

GridView與FormView整合應用

GridView透過DataView.RowFilter去顯示經過篩選過後的資料

自訂GridView的排序

在GridView裡將\n轉換成Html的斷行

<ItemTemplate>
	<%# ((string)Eval("Details")).Replace("\n", "<br/>") %>
</ItemTemplate>
或
<ItemTemplate>
	<%# FormatString(Eval("Details")) %>
</ItemTemplate>

GridView減肥

  • 在欄位的<ItemTemplate>裡,如果用<asp:Label ...></asp:Label> 但未需要做<span>...</span>顯示的話,不如改成使用<asp:Literal ...></asp:Literal>,這樣就不會輸出完整的控制項到用戶端,只會輸出文字內容
  • 以自訂的CSS標簽去取代在<ItemStyle>裡的一堆對齊或顏色的定義
    • 例如:<ItemStyle HorizontalAlign="Center" />會產生 style="text-align: center",如果改用ItemStyle-CssClass="center" 則產生 class="center" , 配合 <style type="text/css"> .center { text-align: center; } </style> 使用

在Header放上刪除的按鈕

  • GridView1裡的第1個欄位
<asp:TemplateField HeaderStyle-Width="57px" ItemStyle-HorizontalAlign="Center">
    <HeaderTemplate>
        <asp:IButton ID="ButtonDeleteSelect" runat="server" CausesValidation="False" 
            Text="刪除" 
            OnClientClick="return confirm('你確定要刪除嗎?');" 
            OnClick="ButtonDeleteSelect_Click"/>
    </HeaderTemplate>
    <ItemTemplate>
        <asp:CheckBox ID="CheckBox1" runat="server" />
    </ItemTemplate>
</asp:TemplateField>
  • 程式碼
protected List<string> SelectID = new List<string>();
protected void ButtonDeleteSelect_Click(object sender, EventArgs e)
{
        SelectID.Clear();
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox CheckBox1 = GridView1.Rows[i].Cells[0].FindControl("CheckBox1") as CheckBox;
            if (CheckBox1.Checked == true)
            {
                SelectID.Add(GridView1.DataKeys[i].Value.ToString());
            }
        }
 
        if (SelectID.Count > 0)
        {
            //實際操作DB作刪除資料的動作...
        }
}

GridView裡的控制項事件失效

protected void Page_Load(object sender, EventArgs e)
{
        if (!this.IsPostBack)
            GridView1_DataBinding();
}
protected void GridView1_DataBinding()
{
        GridViewHelper.setDataBinding(GridView1, SqlDataSource1, ViewState);
}
 
 
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
        GridViewHelper.setSorting(sender, e, ViewState);
        GridView1_DataBinding();
}
 
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
        this.GridView1.PageIndex = e.NewPageIndex;
        GridView1_DataBinding();
}
 
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
        GridView1.EditIndex = e.NewEditIndex;
        GridView1_DataBinding(); 
}
 
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
        GridView1.EditIndex = -1;
        GridView1_DataBinding(); 
}
  • 此外關於資料後端繫結(GridView未使用DataSourceID),需自行實作RowUpdating事件處理函數
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
        try
        {
            e.Cancel = true;
            this.SqlDataSource1.UpdateParameters["ID"].DefaultValue = e.Keys["ID"].ToString();
            this.SqlDataSource1.UpdateParameters["Cast"].DefaultValue = e.NewValues["Cast"].ToString();
            //....略
            this.SqlDataSource1.Update();
 
            GridView1.EditIndex = -1;
            GridView1_DataBinding();
        }
        catch (Exception ex)
        {
        }
}

其他