- - PR -
ソート後のポインタ
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-06-25 07:23
でも、DataBind しても 〜Index は変わらないんじゃなかったっけ? > Jittaさん
もし変わるとしても、-1 じゃなくて 0 ? 元質問の「ソートしたときの SelectedIndex」の話と合わない気もするし… いずれにせよ、なんで 0 になったのかわかりません。 | ||||
|
投稿日時: 2005-06-26 05:24
DataBindしたら、データそのものが変わるから(変わったかどうか、プログラム自身が知るすべはないから)、〜Indexはクリアされると思います。違ったっけ? あれ?ソートしたらDataBindするなぁ…?うん、バインドしてる。 # あ゛〜…更新しなきゃ、だわ DataGridSettingって、設定を保存するクラスを作って、その中でPageIndexを保存するようにしているから、バインドするとクリアされてしまうはず。クリアされるから、外部に保存して、書き戻すようにした。で、インデックスだから、0は先頭のデータを指すはなんだけどなぁ?←だから、選択されていないときは-1。 どんな実装しているんだろう? _________________ | ||||
|
投稿日時: 2005-06-27 10:08
Jitta様、私を引き戻していただいてありがとうございます!
そろそろ諦めようかと思っていたところですが、またやる気になりました。 SelectedIndexの件ですが、私のミスでした;; 話を複雑にしてしまい、スイマセンでした。(反省) Jitta様、にしざき様のおっしゃる通り、Open時(どの行も選択されていない時)は SelectedIndexは -1 になりました。 [選択]ボタンを押した後は、選択された行数がSelectedIndexの値として入ります。 問題はソート後にその行が何行目に移動したのかというところですが、 これは、、、、、どのように取得すればいいのでしょうか? このロジックを入れる場所は DataGrid1_SortCommand で良いと思うのですが。 よろしくお願い申し上げます。 | ||||
|
投稿日時: 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 にできるかもしれません。 いずれにせよ、全体的に思いつきで書いているので正しく動くかどうかはわかりません。 | ||||
|
投稿日時: 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番がまだ出来ない状態です。 もう少しヒントを頂ければとても嬉しいです。 よろしくお願いいたします。 | ||||
|
投稿日時: 2005-06-27 15:11
まず確認ですが、元のソースで dv に何か設定されていますか?
おそらくこれが Nothing だと思います。 だとすると、1. を以下の作業で代替します。 1'-a. ソート後の DataView を何らかの方法で作ろうとしているはずなので これを先に作成し、Sort プロパティを「元のソート条件」に設定する 1'-b. この DataView と SelectedIndex より 対応する DataRowView を得て、対応する DataRow ( 仮に dr とする ) を得る この場合「元のソート条件」が必要となりますので、何らかの方法で 保存しておくようにしてください。 | ||||
|
投稿日時: 2005-06-27 19:58
うろ覚えですが、ポストバックしてきたときにDataSourceはnullになっていると思います(再表示するのに必要ない)。
闇雲にnewするのではなく、何がnullなのか調べ、それに何が入っていて欲しかったのか考え、その上で対策を立てましょう。 今回の場合、SelectedIndexChangedで、選択されたアイテムを識別するIDを保存しておき、ソート後に、DataViewでそのIDが何番目かを調べ直せばいいですよね?ソートするときにDataViewは作っているはずですから、DataGrid.DataSourceから復元しようとせずに、確実にあるものを利用しましょう。 _________________ | ||||
|
投稿日時: 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つの項目が必要なのですが、 ソート後に複数の項目でその行を探すのは可能でしょうか? よろしくお願い致します。(自分でも調べてみます) |