none
ハイパーリンクの問題 RRS feed

  • 質問

  • 今、dataGrigを使って、(dataGrig1とします) dataGrig1の内、一列はハイパーリンク列です。
    該当ハイパーリンク列のデータ(テキストは社員名とします)をクリックした時、新しいページを表示したいです。


    dataGrig1プロパティで、社員名の
    ターゲット: ../08Master/MEmployee/frmMEmployeeMain.aspx?mode=***&data={***}
    URL書式文字列項目: ../08Master/MEmployee/frmMEmployeeMain.aspx?mode=***&data={***},menubar = no, scrollbars = yes, status = no, resizable= no, width = 750, height = 650, top=0, left=0
    上記の通りで、設定しました。

     

    その別ウィンドウを開きました、データのほうがうまく表示しましたが、
    ウィンドウの上にあるメニューバーがない、制御サイズである等ウィンドウになっていないです。

     

    解決策やヒントを教えていただけないでしょうか。

    よろしくお願いいたします。

    2008年9月16日 10:09

回答

すべての返信

  • menubar = no, scrollbars = yes, status = no, resizable= no などで指定されていますが、この意味はおわかりでしょうか?

    2008年9月16日 11:43
    モデレータ
  • trapemiya様

     

    いつも有難うございます。

     

    上記の設定は、開くウィンドウの見た目を設定する項目です。

    yes Or no で有無を決定します。

     

     

    menubar = no,   メニューバーは非表示にする

    scrollbars = yes,  スクロールバーは表示にする

     status = no,  ステータスバーは非表示にする

     resizable = no, リサイズボックス は非表示にする

     

    開きたいページの設定は、間違った所を教えて頂きたいです。

    よろしくお願いします。

    2008年9月16日 13:52
  • あっ、意味がわかりました。うまく動いていないというわけですね? 以下が参考になりませんか?

     

    Datagrid内のHyperlinkに指定サイズの子ウィンドウを開きたい

    http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-31029.htm

    2008年9月16日 14:23
    モデレータ
  • 横レス/便乗質問失礼します。

     

    HyperLinkColumn や、TemplateColumn に配置した HyperLink コントロールの
    NavigateUrl に JavaScript を設定した場合、クリックすると別 Window は開
    くものの、元の Window の表示が維持されない( [object] という表示になっ
    てしまう)ということはないでしょうか? (自分のやり方がまずいだけ?)

     

    その問題を避けるため、TemplateColumn を設けて、そこに LinkButton を配
    置し、onclink イベントのハンドラで RegisterStartupScript メソッドを使
    って・・・と言うような方法を取っているのですが、もっと簡単な方法があ
    れば教えていただけないでしょうか?

    2008年9月16日 16:19
  • trapemiya様

     

    いつも有難うございます。

     

    情報大変参考に成りました。

     

    function navigate()メソッドを作って、

    DataNavigateUrlFormatString="Java scrip t :navigate('../../../mode=***&data={***}','','

    menubar = no , scrollbars = yes, status = no, resizable= no, width = 750, height = 650, top=0, left=100')"

    に修正し、うまくいきました。

     

    お世話になりました。

    感謝いたします。

    また、よろしくお願いします。

    2008年9月17日 6:25
  •  SurferOnWww さんからの引用

    HyperLinkColumn や、TemplateColumn に配置した HyperLink コントロールの
    NavigateUrl に JavaScript を設定した場合、クリックすると別 Window は開
    くものの、元の Window の表示が維持されない( [object] という表示になっ
    てしまう)ということはないでしょうか? (自分のやり方がまずいだけ?)

     

    元のWindowというのはこの場合はDataGridを表示しているWindowでしょうか?

    どういう状況なのかを把握しきれていないのですが、再現するコードはどのようなものなのでしょう・・・

    レベルの高いSurferOnWwwさんなので、私が勘違いしている可能性も十分にありますが・・・

    2008年9月17日 7:05
    モデレータ
  • レスをありがとうございました。

     

    やはり自分のやり方がまずかったです。紹介いただいた下記のページ、

     

     trapemiya さんからの引用

    Datagrid内のHyperlinkに指定サイズの子ウィンドウを開きたい

    http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-31029.htm

     

    をよく見てみると、window.open を隠蔽(?)するように navigate 関数を設けてい

    るのがポイントだと言うことが分かりました。

     

    自分は window.open を直接 NavigateUrl に設定していたので、元のページの

    内容が維持されないという結果になったようです。

    2008年9月17日 11:46
  • window.open, href をキーワードにして検索するなどで調べてみたところ、

     

    href="window.open('Xxxxxxx.html'...

     

    とするとうまくいかないのは常識のようで、単に自分が無知だったという
    ことでした。(汗)

     

    また、JavaScript が使えないユーザーの場合、表示すらされないというさ
    らに大きな問題があるので、以下のようにする方が好ましいというのも初め
    て知ったしだいです。

     

    href="Xxxxxxx.html" onclick="wondow.open('Xxxxxxx.html'...

     

    という訳で、これを実現しようとすると、以下のようなコードになるのでし
    ょうか。HyperLinkColumn ではちょっと無理そうな感じですが、どうで
    しょう?

     

    Code Snippet

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Data" %>

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

    <script runat="server">
        ICollection CreateDataSource()
        {
            DataTable dt = new DataTable();
            DataRow dr;
            dt.Columns.Add(new DataColumn("Name", typeof(String)));
            dt.Columns.Add(new DataColumn("Code", typeof(Int32)));
            for (int i = 0; i < 3; i++)
            {
                dr = dt.NewRow();
                dr[0] = "EmployeeName-" + Convert.ToString(i);
                dr[1] = 1000 + i;
                dt.Rows.Add(dr);
            }
            DataView dv = new DataView(dt);
            return dv;
        }

        void Page_Load(Object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ItemsGrid.DataSource = CreateDataSource();
                ItemsGrid.DataBind();
            }
        }
       
        protected string CreateScript(string url)
        {
            return String.Format("window.open('{0}', '_blank', " +
                "'menubar=no, scrollbars=yes, status=no, resizable=no, width=750, height=650, top=0, left=0'); " +
                "return false;", url);
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>DataGrid 上の HyperLink</title>
    </head>
    <body>
        <form id="form2" runat="server">
        <div>
            <asp:DataGrid id="ItemsGrid"
                runat="server"
                AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundColumn
                        HeaderText="コード"
                        DataField="Code" />
                    <asp:TemplateColumn HeaderText="社員名">
                        <ItemTemplate>
                            <asp:HyperLink ID="HyperLink1" runat="server"
                                Text='<%# Eval("Name") %>'
                                NavigateUrl='<%# "Default.aspx?code=" + Convert.ToString(Eval("Code")) %>'
                                Target="_blank"
                                onclick='<%# CreateScript("Default.aspx?code=" + Convert.ToString(Eval("Code"))) %>'>
                            </asp:HyperLink>
                        </ItemTemplate>
                    </asp:TemplateColumn>
                </Columns>
            </asp:DataGrid>
        </div>
        </form>
    </body>
    </html>

     

     

    2008年9月19日 14:38
  • とりあえずjavscriptが使えない場合は考えないとして、以下のようにすればHyperLinkColumnでもwindow.openはできそうです。

    javscriptが使えない環境の方にはごめんなさいで許してもらえるんじゃないかな?

     

    help with HyperlinkColumn opening a popup window
    http://forums.asp.net/p/661339/661488.aspx#661488

    2008年9月20日 7:32
    モデレータ
  • レスを有難うございました。> trapemiya さん

     

    凝り性なものですから、HyperLinkColumn を使っても JavaScript が使えないユーザー
    にごめんなさいしなくて済む方法はないか考えてみました。

     

    調べてみると、HyperLinkColumn の中にできるのは HyperLink コントロールらしいので、
    DataGrid の ItemDataBound イベントのハンドラで HyperLink.Attributes["onclick"]
    に window.open を設定できるようです。

     

    先のコードにそれを追加すると以下のようになりますが、ちょっと無理やりっぽいので、
    これで本当にいいのかはギモンです(仕様の範囲外かも)。

     

    Code Snippet

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Data" %>

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

    <script runat="server">
        ICollection CreateDataSource()
        {
            DataTable dt = new DataTable();
            DataRow dr;
            dt.Columns.Add(new DataColumn("Name", typeof(String)));
            dt.Columns.Add(new DataColumn("Code", typeof(Int32)));
            for (int i = 0; i < 3; i++)
            {
                dr = dt.NewRow();
                dr[0] = "EmployeeName-" + Convert.ToString(i);
                dr[1] = 1000 + i;
                dt.Rows.Add(dr);
            }
            DataView dv = new DataView(dt);
            return dv;
        }

        void Page_Load(Object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ItemsGrid.DataSource = CreateDataSource();
                ItemsGrid.DataBind();
            }
        }
       
        protected string CreateScript(string url)
        {
            return String.Format("window.open('{0}', '_blank', " +
                "'menubar=no, scrollbars=yes, status=no, resizable=no, width=750, height=650, top=0, left=0'); " +
                "return false;", url);
        }

         
        protected void ItemsGrid_ItemDataBound(object sender, DataGridItemEventArgs e)
        {
            ListItemType itemType = (ListItemType)e.Item.ItemType;

            if ((itemType != ListItemType.Header) &&
               (itemType != ListItemType.Footer) &&
                (itemType != ListItemType.Separator))
            {
                ((HyperLink)e.Item.Cells[2].Controls[0]).Attributes["onclick"] =
                    CreateScript("Default.aspx?code=" + e.Item.Cells[0].Text);
            }
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>DataGrid 上の HyperLink</title>
    </head>
    <body>
        <form id="form2" runat="server">
        <div>
            <asp:DataGrid id="ItemsGrid"
                runat="server"
                AutoGenerateColumns="False"
                onitemdatabound="ItemsGrid_ItemDataBound">
                <Columns>
                    <asp:BoundColumn
                        HeaderText="コード"
                        DataField="Code" />
                    <asp:TemplateColumn HeaderText="社員名">
                        <ItemTemplate>
                            <asp:HyperLink ID="HyperLink1" runat="server"
                                Text='<%# Eval("Name") %>'
                                NavigateUrl='<%# "Default.aspx?code=" + Convert.ToString(Eval("Code")) %>'
                                Target="_blank"
                                onclick='<%# CreateScript("Default.aspx?code=" + Convert.ToString(Eval("Code"))) %>'>
                            </asp:HyperLink>
                        </ItemTemplate>
                    </asp:TemplateColumn>
                    <asp:HyperLinkColumn
                        DataNavigateUrlField="Code"
                        DataNavigateUrlFormatString="Default.aspx?code={0}"
                        DataTextField="Name"
                        HeaderText="HyperLinkColumn"
                        Target="_blank">
                    </asp:HyperLinkColumn>
                </Columns>
            </asp:DataGrid>
        </div>
        </form>
    </body>
    </html>

     

     

    2008年9月20日 12:32
  •  SurferOnWww さんからの引用

    調べてみると、HyperLinkColumn の中にできるのは HyperLink コントロールらしいので、
    DataGrid の ItemDataBound イベントのハンドラで HyperLink.Attributes["onclick"]
    に window.open を設定できるようです。


    お~、すごい。そのあきらめない探究心に関心しました。
    HyperLinkColumn の中に HyperLink コントロールができるんですね。勉強になりました。

     

     SurferOnWww さんからの引用

    先のコードにそれを追加すると以下のようになりますが、ちょっと無理やりっぽいので、
    これで本当にいいのかはギモンです(仕様の範囲外かも)。

    全然問題ないと思います。むしろ通常のHyperLinkColumnの使い方にonclickを追加しているわけですから、考え方としては素直な気がします。

    2008年9月21日 0:00
    モデレータ