- PR -

ソート後のポインタ

投稿者投稿内容
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-06-25 07:23
でも、DataBind しても 〜Index は変わらないんじゃなかったっけ? > Jittaさん
もし変わるとしても、-1 じゃなくて 0 ?
元質問の「ソートしたときの SelectedIndex」の話と合わない気もするし…

いずれにせよ、なんで 0 になったのかわかりません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-06-26 05:24
引用:

にしざきさんの書き込み (2005-06-25 07:23) より:
でも、DataBind しても 〜Index は変わらないんじゃなかったっけ? > Jittaさん
もし変わるとしても、-1 じゃなくて 0 ?
元質問の「ソートしたときの SelectedIndex」の話と合わない気もするし…

いずれにせよ、なんで 0 になったのかわかりません。


 DataBindしたら、データそのものが変わるから(変わったかどうか、プログラム自身が知るすべはないから)、〜Indexはクリアされると思います。違ったっけ?

 あれ?ソートしたらDataBindするなぁ…?うん、バインドしてる
# あ゛〜…更新しなきゃ、だわ
 DataGridSettingって、設定を保存するクラスを作って、その中でPageIndexを保存するようにしているから、バインドするとクリアされてしまうはず。クリアされるから、外部に保存して、書き戻すようにした。で、インデックスだから、0は先頭のデータを指すはなんだけどなぁ?←だから、選択されていないときは-1。  どんな実装しているんだろう?
_________________
nori
ベテラン
会議室デビュー日: 2004/09/02
投稿数: 56
投稿日時: 2005-06-27 10:08
Jitta様、私を引き戻していただいてありがとうございます!

そろそろ諦めようかと思っていたところですが、またやる気になりました。

SelectedIndexの件ですが、私のミスでした;;
話を複雑にしてしまい、スイマセンでした。(反省)

Jitta様、にしざき様のおっしゃる通り、Open時(どの行も選択されていない時)は
SelectedIndexは -1 になりました。

[選択]ボタンを押した後は、選択された行数がSelectedIndexの値として入ります。
問題はソート後にその行が何行目に移動したのかというところですが、
これは、、、、、どのように取得すればいいのでしょうか?
このロジックを入れる場所は DataGrid1_SortCommand で良いと思うのですが。

よろしくお願い申し上げます。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-06-27 10:34
SortCommand の中で自分でソートを行っている(DataView.Sort プロパティの設定かもしれませんが)んですよね。

「一般的な方法」ではなく、対象データが DataTable を基にした DataView のときですが、
DataGrid.SortCommand イベントで、
1. ソート前の DataView と SelectedIndex より 対応する DataRowView を得て、対応する DataRow ( 仮に dr とする ) を得る
2. ソートを適用する
3. ソート後の DataView から dr を参照する DataRowView を探し、これの位置を SelectedIndex に設定する
4. DataBind する

でうまくいくんじゃないかという気がします。

もしソート前後で DataRowView が不変であれば 1. と 3. での対象を DataRow ではなく DataRowView にできるかもしれません。

いずれにせよ、全体的に思いつきで書いているので正しく動くかどうかはわかりません。
nori
ベテラン
会議室デビュー日: 2004/09/02
投稿数: 56
投稿日時: 2005-06-27 14:54
にしざき様、丁寧な解説ありがとうございます。

何となく分かってきました。
そこで下記のようにしてみたところ、エラーが出ました。

--------------------------------------------------
Dim dv As New DataView
Dim dr As New DataRow

dv = DataGrid1.DataSource
dr = dv.Item(DataGrid1.SelectedIndex).Row ←ココでエラー
--------------------------------------------------
オブジェクト参照がオブジェクト インスタンスに
設定されていません。
--------------------------------------------------

そこで dr の定義に New を入れたところ

--------------------------------------------------
Dim dv As New DataView
Dim dr As New DataRow  ←ココでエラー

dv = DataGrid1.DataSource
dr = dv.Item(DataGrid1.SelectedIndex).Row
--------------------------------------------------
'Protected'であるため、このコンテキストでは
アクセスできません。
--------------------------------------------------

となってしまいました。

にしざき様に教えていただいた1番がまだ出来ない状態です。
もう少しヒントを頂ければとても嬉しいです。

よろしくお願いいたします。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-06-27 15:11
まず確認ですが、元のソースで dv に何か設定されていますか?
おそらくこれが Nothing だと思います。

だとすると、1. を以下の作業で代替します。
1'-a. ソート後の DataView を何らかの方法で作ろうとしているはずなので
これを先に作成し、Sort プロパティを「元のソート条件」に設定する
1'-b. この DataView と SelectedIndex より 対応する DataRowView を得て、対応する DataRow ( 仮に dr とする ) を得る

この場合「元のソート条件」が必要となりますので、何らかの方法で
保存しておくようにしてください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-06-27 19:58
 うろ覚えですが、ポストバックしてきたときにDataSourceはnullになっていると思います(再表示するのに必要ない)。

 闇雲にnewするのではなく、何がnullなのか調べ、それに何が入っていて欲しかったのか考え、その上で対策を立てましょう。


 今回の場合、SelectedIndexChangedで、選択されたアイテムを識別するIDを保存しておき、ソート後に、DataViewでそのIDが何番目かを調べ直せばいいですよね?ソートするときにDataViewは作っているはずですから、DataGrid.DataSourceから復元しようとせずに、確実にあるものを利用しましょう。

_________________
nori
ベテラン
会議室デビュー日: 2004/09/02
投稿数: 56
投稿日時: 2005-06-28 11:42
にしざき様、Jitta様

ありがとうございます。
昨日、途中経過を出したつもりでしたが、送信ボタンを押すのを
失念していたようです。すいません。

やはり取得したDataRowはNullでした;
DataBind時にDataViewをセッションに入れ、それを使うように
しました。

------------------------------------------------------
Private Sub DataGrid1_SortCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs) Handles DataGrid1.SortCommand

 Dim dv As DataView
 Dim dr As DataRow
 Dim dr_flag As Integer
 
 dr_flag = 0
 
 'DataRowを取得する
 dv = Session("DataGrid_DataView")
 If DataGrid1.SelectedIndex >= 0 Then '行が選択されているとき
  dr = dv.Item(DataGrid1.SelectedIndex).Row
  dr_flag = 1
 End If
 
 'ソートの順序を決定する
 If SortExpression <> e.SortExpression Then
   SortExpression = e.SortExpression
   SortDirection = "asc"
 Else
   If SortDirection = "asc" Then
   SortDirection = "desc"
   Else
   SortDirection = "asc"
   End If
 End If

 'DataGridをBindする処理
 BindGrid(SortExpression & " " & SortDirection, Session("strSQL"))

 'ここで選択されていたデータを探す処理を書けばいいと思う・・・・・
 if dr_flag = 1 then
   (どう書けば良いのか分からずモヤモヤ中)
 End If

End Sub
------------------------------------------------------

分からないことがあります。
(1) DataRow と DataRowView はどうちがうのでしょうか?
(2) なぜ「元のソート条件」が必要なのでしょうか?
(3) 選択された行を識別するには2つの項目が必要なのですが、
  ソート後に複数の項目でその行を探すのは可能でしょうか?

よろしくお願い致します。(自分でも調べてみます)

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