DOBON.NET DOBON.NETプログラミング掲示板過去ログ

asp:HyperLinkFieldをクリックイベント取得

環境/言語:[ASP.NET 2.0  VisualStudio2005(VB)  SqlServer2008]
分類:[ASP.NET]

いつも参考にさせていただいております。
ASP.NET GridViewのasp:HyperLinkFieldをクリックした時のイベントを
自ページ内で取得する事は可能でしょうか。
SelectedIndexChangedやSelectedIndexChangingイベントでうまく取得する事が出来ませんでした。

■ソースコード
<asp:HyperLinkField DataTextField="orderLine" HeaderText="行" SortExpression="行"
DataNavigateUrlFields="引数1,引数2"
DataNavigateUrlFormatString="./遷移先.aspx?第一引数={0}&amp;第二引数={1}"
Target="_self" />
■No28641に返信(はちまきさんの記事)
イベントの名称から推測すると設定したいイベントはサーバー側でのイベントでしょうか。

HyperLinkFieldコントロールは以下のようなHTMLを出力します。
ユーザーがクライアント側でリンクをクリックするとブラウザはリンク先を開きます。
ブラウザは情報をサーバーに送りませんので処理がサーバー側に移ることはありません。
サーバー側のクリックイベントをHyperLinkFieldコントロールで利用することはできません。

<a id="HyperLink1" href="http://www.google.co.jp/">HyperLink</a>

LinkButtonコントロールを使用してはいかがでしょうか。
LinkButtonコントロールは以下のようなHTMLを出力します。
ユーザーがクライアント側でリンクをクリックするとブラウザはフォームをサブミットします。
ブラウザは情報をサーバーに送り処理がサーバー側に移ります。
サーバー側のクリックイベントを利用することができます。

<a id="LinkButton1" href="javascript:__doPostBack('LinkButton1','')">LinkButton</a>
<script type="text/javascript">
    function __doPostBack(eventTarget, eventArgument) {
        ……
        theForm.submit();
    }
</script>
もりおさん

 ご教示有難う御座いました。

 サーバ側でActionが取得できるようになりました
 そこで<asp:ButtonField 項目値を取得する事がなぜかできません。
 画面表示されております。
 が
 VB.NET側の処理で
 Dim test As String = row.Cells(1).Text
 ※上記のCells(1)がDataTextField ="明細"に該当します。
 変数名test値が取得できずに困っております。
 <asp:ButtonField から値を取得する場合には何か特殊な方法が必要なのでしょうか。

■変更後のロジック抜粋
 <asp:GridView の <Columns>項目を
 <asp:ButtonField CommandName="Select" DataTextField ="明細" HeaderText ="行" SortExpression ="行"/> と変更しました。

 

 アドバイス宜しくお願い致します。
■No28653に返信(はちまきさんの記事)

その後、いろいろ試してみたのですが
Gridview1_RowCommandイベント使用しても同様に取得する事が出来ませんでした。

Dim index As Integer = Convert.ToInt32(e.CommandArgument)
 →上記のでは、選択したRowを取得できます
Dim selectedRow As GridViewRow = Gridview1.Rows(index)
 →上記のでは、選択したRowを取得できます
Dim TestCell As TableCell = selectedRow.Cells(1)
 →上記のでは、選択したRowを取得できます
Dim strTest As String = TestCell.Text
 →上記のでは、選択したRowのTEXTを確認すると""が設定されて
  画面表示されている値を取得する事が出来ません。

 アドバイス、ご教示宜しくお願い致します。
■No28658に返信(はちまきさんの記事)
GridViewというのを見落としていました。ButtonFieldコントロールの方が
LinkButtonコントロールより適切でした。失礼しました。

ButtonFieldコントロールが生成するボタンのテキストを取得したいということですかね。
ボタンはCells(1)に配置されているということですか。

コントロールの構造は以下のようになります。

GridViewRow
└─DataControlFieldCell
   └─DataControlLinkButton

はちまきさんのコードのselectedRowがGridViewRowオブジェクト、TestCellが
DataControlFieldCellオブジェクトです。

TestCellのControlsプロパティを参照してDataControlLinkButtonオブジェクトを取得して型変換
してTextプロパティを参照するとよいです。

DataControlLinkButton型のアクセス修飾詞はinternalです。取得したObject型の
DataControlLinkButtonオブジェクトをDataControlLinkButton型に型変換することはでき
ません。DataControlLinkButton型の基本型であるLinkButton型もしくはLinkButton型の基本型
であるIButtonControl型に型変換するとよいと思います。

Dim button As IButtonControl = DirectCast(TestCell.Controls(0), IButtonControl)
Dim strTest As String = button.Text


ButtonFieldコントロールのCommandNameプロパティにSelectを設定している場合
GridView.SelectedIndexChangedイベントが発生します。ボタンをSelectedIndexChanged
イベントのハンドラで取得する場合は当該行をGridView.SelectedRowプロパティで参照できますので
こんな感じでできるかと思います。

Dim button As IButtonControl = _
    DirectCast(GridView1.SelectedRow.Cells(1).Controls(0), IButtonControl)

もりおさん、

ご教示、アドバイス有難う御座いました。
Controls(0), という配列要素がまだしっかりと理解できておりませんが
下記を参考に無事にボタンコントロールのテキスト値を取得する事が出来ました。

Dim button As IButtonControl = _
DirectCast(GridView1.SelectedRow.Cells(1).Controls(0), IButtonControl)
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板