- PR -

GridViewとfocusの関係

投稿者投稿内容
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-24 19:19
かるあさん、ご返信ありがとうございます。

かるあさんの「なんとなく」コード、試してみました。
うまくいきませんでした。。。
すなわち、フォーカスはセットされませんでした。。。

SortingではなくSortedで実装するのか? と思ってやろうとしましたが、引数に「System.Web.UI.WebControls.GridViewSortEventArgs」を持っていなかったので、(力不足の私は)にっちもさっちもいかなくなりました。。。
また、お知恵をお借りできると幸いです。

あと、DirectCastとCTypeの違い、後で調べようと思っておりましたが、早速URLを拝見しました。納得です。現在開発中のシステムは、レスポンスの速さも「それなりに」求められておりますので、大いに参考にさせて頂きます。

本当にいろいろとありがとうございます。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-11-25 14:36
さすがになんとなくだけあって、

コード:

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.Colum...
    End If
Next


これはいかがなものかと思いましたがw
ついでに言うと一致する列見つけた後にbreakしてないし。
#無駄なループはCType以上に性能に影響します

しかしそういう細かいつっこみはおいといて、
私の環境ではちゃんと動くのにおかしーなーと思って
いろいろ試してたら、わかってきましたよ。
ずばり、デザイナから設定したDataSourceを使ってますね m9(・∀・)

まず、TabIndexと同様、LinkButtonへの属性の追加は、
DataBindの後でやらないと反映されません。

私は(そしておそらくかるあさんも)コード上で
DataSourceをセットして、DataBind()を自分でコールしてたので、
Sortingイベントハンドラ内で「DataBind後」の状態をつくることができてました。
ところが、デザイナで設定したDataSourceを使うと、DataBind()は自分でコールしないんですね。
#使ったことなかったから知らなかった orz

試しにデザイナから設定したDataSourceを初めて使ってみて、
空のSorting、Sorted、DataBinding、DataBoundのイベントハンドラを作って
ブレークポイントをはってデバッグしてみたら、イベントは
Sorting⇒Sorted⇒DataBinding⇒DataBoundの順に発生しました。

だから、Sortedでやってもだめで、DataBoundでやったらうまくいきました。
コードはこんなかんじです。

コード:

Private _ColumnIndex As Integer = -1

Protected Sub GridView1_Sorting(ByVal sender As Object, _
 ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles GridView1.Sorting
    For Each col As DataControlField In GridView1.Columns
        If e.SortExpression = col.SortExpression Then
            _ColumnIndex = GridView1.Columns.IndexOf(col)
            Exit For
        End If
    Next
End Sub

Protected Sub GridView1_DataBound(ByVal sender As Object, _
 ByVal e As System.EventArgs) Handles GridView1.DataBound
    If _ColumnIndex >= 0 Then
        DirectCast(GridView1.HeaderRow.Cells(_ColumnIndex).Controls(0), LinkButton).Focus()
    End If
End Sub

かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-11-26 00:06
うぁ、はずかしい(汗
ぼのぼのさん フォローありがとうございます。

デザイナで設定するとイベントの発生じゅう所が違ったんですね。
勉強になります。
_________________
かるあ のメモスニペット
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-27 09:59
ご返信、ありがとうございます。

ぼのぼのさんの実装方法で、うまくいきました!
クラス変数を定義して、sortingでソート対象列を格納、databoundでフォーカス設定という流れですね。
確かに、クラス変数を定義するという発想は常道ですよね。。。
開発環境が違うと、こうした発想も飛んでいってしまいます。。。

Exit Forのご指摘も大変助かりました。

本当にいろいろと勉強になります。ありがとございました。
今後とも宜しくお願い致します。

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