- PR -

GridViewとfocusの関係

投稿者投稿内容
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-21 19:01
<前提>

言語:ASP.NET 2.0 (VB.NET)
環境:VisualStudio2005

<要件・質問>

GridViewでソート利用時の列名リンクにフォーカスを設定したいが、実現方法が分かりません。

<何が問題か?>

1)Focusメソッドは、原則、コントロール単位にフォーカス設定するものであるので、GridView「全体」にフォーカス設定は可能である。一方、今回実現したい「ソート利用時の列名リンク」はGridViewの「中身」であるため、そもそも実現可能か分からない。(ただ、Tabキーにて当該リンクにフォーカスが移動するので、不可能ではないような気がしています。)

2)Focusメソッド、コントロール単位のみならず、HTMLタグのid単位に設定することも可能である。(例えば、RadioButtonListコントロール"rdolstXXXX"の1個目のボタンにフォーカス設定したいときは、当該タグでidとして振られている"rdolstXXXX_0"にフォーカスを設定することができる。)
しかしながら、今回、GridView内の列名リンクには、HTML上、そのようなidが振られることはない。(GridView全体として、Tableタグにidが振られる。)

3)helpを見てみましたが、それらしいものが見つかっておりません。(ListView.FocusedItemプロパティというものを利用できないかと考え実装してみましたが、そもそもListViewクラスなど無い!とコンパイルエラーとなる。)

拙い日本語で大変恐縮ですが、どなたかご教示頂けると幸いです。
以上、宜しくお願い致します。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-11-22 01:27
GridViewの列名リンクの先頭にフォーカスがあたればよいのであれば、単純に
GridViewにたいしてSetFocusするだけでいいようですが。
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-22 10:05
どっとねっとふぁんさん、ご回答ありがとうございます。

質問の仕方が悪かったです。不慣れだと、質問するにも一苦労です。。。
「本当の」要件は以下の2つでした。

<要件1>
ソートリンクをクリックした時、フォーカスがクリアされてしまう(「どこかに飛んでいってしまう」)ところを、フォーカスを移動させたくない。
すなわち、例えば、列名リンクの2列目のリンクをクリックした時に、ソート処理後も2列目にフォーカスが設定されているようにしたい。
(→これを実現するために、列名リンクの「特定の」リンクにフォーカスを設定したいと考えておりました。)

<要件2>
TabIndexを「特定の」リンク毎に設定したい。
(GridViewコントロールにTabIndexを設定すると、GridView「全体」にフォーカスが設定されてしまう。)
(→列名リンクの「特定の」リンクにフォーカスが設定できるのであれば、「特定の」リンクにTabIndexを設定できると考えておりました。)

以上の要件を満たす実装方法があればご教示頂けると幸いです。
宜しくお願い申し上げます。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-11-24 01:26
まず、TabIndexですが、

コード:

CType(GridView1.HeaderRow.Cells(0).Controls(0), LinkButton).TabIndex = 10


てなかんじでできませんか?

さらに、これを応用すると、フォーカス設定も、

コード:

CType(GridView1.HeaderRow.Cells(0).Controls(0), LinkButton).Attributes("id") = _
    "tekitou_na_ichii_no_id"
Page.ClientScript.RegisterStartupScript(Me.GetType(), "COLUMN_FOCUS_SCRIPT", _
    "<script>document.getElementById('tekitou_na_ichii_no_id').focus()</script>")


てなかんじでできませんか?
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-24 10:43
ぼのぼのさん、ご返答ありがとうございます。

下記コードですが、うまくいきませんでした。
 CType(GridView1.HeaderRow.Cells(0).Controls(0), LinkButton).TabIndex = 10

「GridView1.HeaderRow」でNullReferenceExceptionとなります。
「GridView1」はオブジェクトのインスタンスあり。
 (当然、「GridView1」は適切なオブジェクト名に変えてデバッグしております。)

発想としては納得感のあるやり方だと思ったのですが。。。
何か、うまい方法があればご教示願いたく存じます。

宜しくお願いいたします。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-11-24 11:33
引用:

のすけさんの書き込み (2006-11-24 10:43) より:

「GridView1.HeaderRow」でNullReferenceExceptionとなります。


どのタイミングで取得して設定していますか?
DataBind の前にやろうとしていませんか?

これでもできた
コード:
DirectCast(GridView1.HeaderRow.Cells(0).Controls(0), LinkButton).Focus()


_________________
かるあ のメモスニペット
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-24 16:37
かるあさん、ご返信ありがとうございます。

ご指摘の通り、DataBind の前にやろうとしていました。。。
(GridView_Databoundで実装したつもりだったのですが。。。)
お恥ずかしい限りです。。。

かるあさんのコードにつき、正常(要件通り)にTabIndex設定されることを確認致しました。(DirectCastとCTypeの違いにつき、あまり理解していませんが。。。)

そこで、もう1つ教えて頂きたいのですが、、、

<質問>
<要件1>を実現するにあたり、どの項目(列)でソートリンクが押下されたかを取得する方法はないでしょうか。(<要件1>については下記に再掲致します。)

<要件1> (再掲)
ソートリンクをクリックした時、フォーカスがクリアされてしまう(「どこかに飛んでいってしまう」)ところを、フォーカスを移動させたくない。
すなわち、例えば、列名リンクの2列目のリンクをクリックした時に、ソート処理後も2列目にフォーカスが設定されているようにしたい。

<問題点(?)>
SortExpressionプロパティでは、バインドしたデータソースの項目名が取得されてしまい、フォーカス設定するコントロールを指定することができませんでした。

以上、度重なる質問で大変恐縮ですが、宜しくお願い申し上げます。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-11-24 18:14
なんとなくやってみた
コード:
    Protected Sub GridView1_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles GridView1.Sorting
        Dim Grid As GridView = DirectCast(sender, GridView)

        For Each col As DataControlField In Grid.Columns
            If e.SortExpression = col.SortExpression Then
                DirectCast(GridView1.HeaderRow.Cells(GridView1.Columns.IndexOf(col)).Controls(0), LinkButton).Focus()
            End If
        Next
    End Sub


パラメータの SortExpression と同じ カラムの SortExpression を見つけて、
そのヘッダーをフォーカスしてあげる。

引用:

のすけさんの書き込み (2006-11-24 16:37) より:

(DirectCastとCTypeの違いにつき、あまり理解していませんが。。。)


そうくると、じゃんぬさんのブログかな
http://blogs.wankuma.com/jeanne/archive/2005/03/18/12271.aspx
_________________
かるあ のメモスニペット

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