如何在 GridView 的 HyperLinkField 資料行中實現 window.open 效果

本文將介紹在 GridView 的 HyperLinkField 資料行中實現 window.open 效果的可能解決方案。

情境描述

朋友 Kazuya 和筆者討論到如何在 GridView 的 HyperLinkField 資料行,做到點了 HyperLink 之後以 window.open 方式開啟網頁的效果,實現的方式很多種,筆者以下一節的方式來嘗試做出朋友所需要的效果。

實作步驟

首先從工具箱中拉一個 GridView 控制項至 *.Aspx 檔案,為示範方便筆者使用 SqlDataSource 控制項,連接 LocalDB 中的 Northwind 資料庫,讀取  Region 資料表來顯示到 GridView 之中,其中將 RegionID 資料行以 HyperLinkField 呈現,RegionDescription 則由 BoundFiled 呈現,程式碼如下:


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" 
    Inherits="WebApplication2.WebForm3" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
            DataKeyNames="RegionID" DataSourceID="SqlDataSource1" 
            OnRowDataBound="GridView1_RowDataBound">
            <Columns>
                <asp:HyperLinkField DataTextField="RegionID" HeaderText="RegionID" Text="RegionID" />
                <asp:BoundField DataField="RegionDescription" 
                    HeaderText="RegionDescription" SortExpression="RegionDescription" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:NWConnectionString %>" 
            SelectCommand="SELECT * FROM [Region]"></asp:SqlDataSource>
    </div>
    </form>
</body>
</html>

接著在 GridView.RowDataBound 事件中以 foreach 巡覽 GridView 的第 1 個 Cell(第 5 列)中的所有控制項,找到控制項型別為 HyperLink 的控制項(第 7 列)後將之轉型為 HyperLink 控制項(第 9 列),最後利用 AttributeCollection.Add 方法來加入 Client 端的 onclick 事件,並設定 onclick 事件觸發時利用 window.open 開啟另一個網頁(第 10 列),若您不指定 HyperLink.NavigateUrl 屬性則 Render 到 Client 端時並不會出現 HyperLink 該有的底線,因此筆者將之設定為 #,以防止點了 HyperLink 後被導到不同頁面。程式碼如下:


protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                foreach (Control c in e.Row.Cells[0].Controls)
                {
                    if (c.GetType().Equals(typeof(HyperLink)))
                    {
                        HyperLink hl = (HyperLink)c;
                        hl.Attributes.Add("onclick", "window.open('WebForm1.aspx');");
                        hl.NavigateUrl = "#";
                    }
                }
            }

透過上述的做法就可以在 HyperLinkField 資料行中實現 window.open 效果。

參考資料

- Creating or Opening New Windows (pop-up) in JavaScript

- Opening a new window from a HyperLinkField of gridview in asp.net

- GridView.RowDataBound