- PR -

DataGridのハイパーリンク列について

1
投稿者投稿内容
にし
会議室デビュー日: 2002/06/18
投稿数: 18
お住まい・勤務地: 東京都
投稿日時: 2002-07-10 19:38
ASP.NETのDataGridで、ハイパーリンク列のURLフィールドを複数指定したいのですが、
うまくできません。
どうすればよいのでしょうか。
そもそも1フィールドしか指定でないのでしょうか。
(その場合、複数フィールド値を任意の区切り文字で繋げたフィールドを用意し、
遷移先でSplitで切り出す?)

ご教授の程よろしくお願いします。
うりゅう
大ベテラン
会議室デビュー日: 2002/06/15
投稿数: 202
お住まい・勤務地: Hiroshima
投稿日時: 2002-07-10 23:29
ちょっと、質問の意味がわかりにくいのですが、

ハイパーリンク列のURLフィールドを複数指定するというのは以下のどれですか?

1・URLアドレスそのものを複数割り当てる。

2・「detail.aspx?ID=1,5,7」のようにひとつの列に対する複数条件を割り当てる。

3・「detail.aspx?ID=1&PASS='TEST'」のように複数列の条件を割り当てる。

1は無いと思うのですが(苦笑)、2か3の場合にはテンプレート列を使用すれば割り当ては可能だと思われます。
_________________
--------------------------------------
ネットビルド 小田原貴樹
odahara@netbuiuld.jp
--------------------------------------
にし
会議室デビュー日: 2002/06/18
投稿数: 18
お住まい・勤務地: 東京都
投稿日時: 2002-07-11 12:03
うりゅうさん。
確かに1は違います。(^^;
もう少し詳しく書かせていただきますね。

URLフィールドの指定が1つの場合(書式はとりあえず)

HyperLinkColumnのプロパティとして書くならば
.DataNavigateUrlField = "Field1";
.NavigateUrl = "test.aspx?field1={0}";

テンプレート列のNavigateUrlのカスタム連結式として書くならば
DataBinder.Eval(Container, "Field1", "test.aspx?field1={0}")

となりますよね。(たぶん)
今回は、2フィールド以上、すなわち、

HyperLinkColumnのプロパティで言えば、
.DataNavigateUrlField = "Field1"; にさらに"Field2"も設定し、
.NavigateUrl = "test.aspx?field1={0}&field2={0}";

テンプレート列のNavigateUrlのカスタム連結式で言えば、
DataBinder.Evalのexpressionに"Field2"を追加し、
DataBinder.Eval(Container, Field1とField2を指定, "test.aspx?field1={0}&field2={0}")

以上の様なことをしたいのですが、書き方がわかりません。
説明がまだイマイチかもしれませんが、うりゅうさん、皆さん、
良いアイデアがあれば教えてください。

[ メッセージ編集済み 編集者: にし 編集日時 2002-07-11 12:59 ]
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-07-11 15:12
HyperLinkColumnの代わりにTemplateColumn, ItemTemplate, HyperLinkコントロール
を使用すると可能です。

HyperLinkのNavigateUrlプロパティには、DataBinding Expressionタグで
GetUrl()関数を指定します。この関数の引数には、DataGridのDataRowVeiw
を指定します。

コード:

Function GetUrl(drv As DataRowView) As String
Dim drow As DataRow = drv.Row
Return "Detail.aspx?f1=" & drow("Field1") & "&f2=" & drow("Field2")
End Function

<asp:TemplateColumn HeaderText="HyperLink">
<ItemTemplate>
<asp:HyperLink id="myLink" runat="server"
NavigateUrl='<%# GetUrl(Container.DataItem) %>'
Text="Link" />
</ItemTemplate>
</asp:TemplateColumn>



他に、Field1とField2をSQLで結合させてQueryStringを事前に作成する方法も
あります。

Happy Programming!
Akio Kasai

[ メッセージ編集済み 編集者: Dr ADO.NET 編集日時 2002-07-11 15:13 ]
にし
会議室デビュー日: 2002/06/18
投稿数: 18
お住まい・勤務地: 東京都
投稿日時: 2002-07-11 21:36
Dr ADO.NETさん
ありがとうございます。
Dr ADO.NETさんの方法を試したのですが、私の場合うまく出来ませんでした。
とりあえず今回は、当初の目標から少しずれましたが下記の様な方法でやってみました。

・DataGridにButtonColumn(選択)を追加
・ItemCommandイベント処理に下記コードを記述
【コード】
string strResultID,strEntryNo;
if (e.CommandName == "Select")  //'Select'はButtonColumnのコマンド名
{
  Field1 = e.Item.Cells[1].Text;
  Field2 = e.Item.Cells[2].Text;
  Response.Redirect("test.aspx?Field1=" + Field1 + "&Field2=" + Field2);
}

ButtonColumnを追加したので、当初の予定より、1列増えたことになります。
今後、Dr ADO.NETさんの方法が必要な時が来ると思われますので、再度TRYしたいと思います。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-07-12 09:54
C#を使用する場合は、以下のようにGetUrl()関数にContainer.DataItem
を指定するとき、DataRowViewをCastする必要があります。

C#版のサンプル:

コード:
String GetUrl(DataRowView drv) 
{ 
  DataRow drow = drv.Row;
  return "Detail.aspx?f1" + drow["Field1"] + "&f2=" + drow["Field2"];
}

<asp:TemplateColumn HeaderText="HyperLink">    
  <ItemTemplate>
     <asp:HyperLink id="myLink" runat="server" 
       NavigateUrl='<%# GetUrl((DataRowView) Container.DataItem) %>'
       Text="Link" />
  </ItemTemplate>
</asp:TemplateColumn>



Happy Programming
Akio Kasai
1

スキルアップ/キャリアアップ(JOB@IT)