トップ回答者
ハイパーリンクの問題

質問
-
今、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
上記の通りで、設定しました。その別ウィンドウを開きました、データのほうがうまく表示しましたが、
ウィンドウの上にあるメニューバーがない、制御サイズである等ウィンドウになっていないです。解決策やヒントを教えていただけないでしょうか。
よろしくお願いいたします。
回答
-
あっ、意味がわかりました。うまく動いていないというわけですね? 以下が参考になりませんか?
Datagrid内のHyperlinkに指定サイズの子ウィンドウを開きたい
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-31029.htm
すべての返信
-
あっ、意味がわかりました。うまく動いていないというわけですね? 以下が参考になりませんか?
Datagrid内のHyperlinkに指定サイズの子ウィンドウを開きたい
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-31029.htm
-
横レス/便乗質問失礼します。
HyperLinkColumn や、TemplateColumn に配置した HyperLink コントロールの
NavigateUrl に JavaScript を設定した場合、クリックすると別 Window は開
くものの、元の Window の表示が維持されない( [object] という表示になっ
てしまう)ということはないでしょうか? (自分のやり方がまずいだけ?)その問題を避けるため、TemplateColumn を設けて、そこに LinkButton を配
置し、onclink イベントのハンドラで RegisterStartupScript メソッドを使
って・・・と言うような方法を取っているのですが、もっと簡単な方法があ
れば教えていただけないでしょうか? -
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')"
に修正し、うまくいきました。
お世話になりました。
感謝いたします。
また、よろしくお願いします。
-
SurferOnWww さんからの引用 HyperLinkColumn や、TemplateColumn に配置した HyperLink コントロールの
NavigateUrl に JavaScript を設定した場合、クリックすると別 Window は開
くものの、元の Window の表示が維持されない( [object] という表示になっ
てしまう)ということはないでしょうか? (自分のやり方がまずいだけ?)元のWindowというのはこの場合はDataGridを表示しているWindowでしょうか?
どういう状況なのかを把握しきれていないのですが、再現するコードはどのようなものなのでしょう・・・
レベルの高いSurferOnWwwさんなので、私が勘違いしている可能性も十分にありますが・・・
-
レスをありがとうございました。
やはり自分のやり方がまずかったです。紹介いただいた下記のページ、
trapemiya さんからの引用 Datagrid内のHyperlinkに指定サイズの子ウィンドウを開きたい
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-31029.htm
をよく見てみると、window.open を隠蔽(?)するように navigate 関数を設けてい
るのがポイントだと言うことが分かりました。
自分は window.open を直接 NavigateUrl に設定していたので、元のページの
内容が維持されないという結果になったようです。
-
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> -
とりあえずjavscriptが使えない場合は考えないとして、以下のようにすればHyperLinkColumnでもwindow.openはできそうです。
javscriptが使えない環境の方にはごめんなさいで許してもらえるんじゃないかな?
help with HyperlinkColumn opening a popup window
http://forums.asp.net/p/661339/661488.aspx#661488 -
レスを有難うございました。> 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> -
SurferOnWww さんからの引用
調べてみると、HyperLinkColumn の中にできるのは HyperLink コントロールらしいので、
DataGrid の ItemDataBound イベントのハンドラで HyperLink.Attributes["onclick"]
に window.open を設定できるようです。
お~、すごい。そのあきらめない探究心に関心しました。
HyperLinkColumn の中に HyperLink コントロールができるんですね。勉強になりました。SurferOnWww さんからの引用
先のコードにそれを追加すると以下のようになりますが、ちょっと無理やりっぽいので、
これで本当にいいのかはギモンです(仕様の範囲外かも)。
全然問題ないと思います。むしろ通常のHyperLinkColumnの使い方にonclickを追加しているわけですから、考え方としては素直な気がします。