- PR -

DataGridのCurrentPageIndexについて

1
投稿者投稿内容
ax stone
会議室デビュー日: 2006/07/07
投稿数: 16
投稿日時: 2006-10-12 22:58
DataGridで複数のDataGridItemを選択し、一括で削除しています。

たとえば、2ページ分のDataGridItemがあり(PageCount=2)、
2ページ目を表示しています(CurrentPageIndex=2)。

2ページ目のDataGridItemをすべて選択し、削除すると、
CurrentPageIndex=2なのに、バインド後のPageCount=1になり、
エラーが発生します。
この問題を解決するためにはどうすればよいのでしょうか?

----------------

DataView dv = new DataView(dt);
dv.Sort = "ID";
for (int n = 0; n < id.Length; n++)
{
 int idx = dv.Find(int.Parse(id[n].ToString()));
 dv.Delete(idx);
}
this.DataGrid.DataSource = dv;
this.DataGrid.DataKeyField = "ID";
this.DataGrid.DataBind();   ←ここでエラー

------------------
<エラーメッセージ>
CurrentPageIndex 値が無効です。
値は 0 以上で PageCount より小さくなければなりません。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-10-13 06:40
引用:

2ページ目のDataGridItemをすべて選択し、削除すると、
CurrentPageIndex=2なのに、バインド後のPageCount=1になり、
エラーが発生します。


削除したときは、
CurrentPageIndexを「1」に初期化して
先頭ページにリセットしたらどうでしょうか。

this.DataGrid.CurrentPageIndex = 1;
this.DataGrid.DataBind();

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2006-10-13 09:43
引用:

Accessさんの書き込み (2006-10-13 06:40) より:
引用:

2ページ目のDataGridItemをすべて選択し、削除すると、
CurrentPageIndex=2なのに、バインド後のPageCount=1になり、
エラーが発生します。


削除したときは、
CurrentPageIndexを「1」に初期化して
先頭ページにリセットしたらどうでしょうか。

this.DataGrid.CurrentPageIndex = 1;
this.DataGrid.DataBind();



先頭ページという事だと、0にする必要があったと思います。
どちらにしろ、
エラーメッセージ
引用:

CurrentPageIndex 値が無効です。
値は 0 以上で PageCount より小さくなければなりません。



にあるとおり、範囲内の値にする必要があるという事ですね。
ax stone
会議室デビュー日: 2006/07/07
投稿数: 16
投稿日時: 2006-10-13 11:45
>先頭ページにリセットしたらどうでしょうか。
私もはじめはそう考えました。
しかし、それじゃ親切じゃないなぁと思いまして。。。
何とかして前ページに移動したいのですが、
バインド後にしかエラーが発生しないので、
バインド前に毎回、DataViewのアイテム数より、
ページ数を計算するしかないのかなぁと思っています。
他に何か他に良い方法などありましたら、教えていただけないでしょうか?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2006-10-13 13:40
引用:

ax stoneさんの書き込み (2006-10-13 11:45) より:
バインド前に毎回、DataViewのアイテム数より、
ページ数を計算するしかないのかなぁと思っています。



PageSizeを利用して、これを行うのが現実的な解かもしれませんね。



[ メッセージ編集済み 編集者: NAL-6295 編集日時 2006-10-13 13:41 ]
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-10-14 06:01
引用:

>先頭ページにリセットしたらどうでしょうか。
私もはじめはそう考えました。
しかし、それじゃ親切じゃないなぁと思いまして。。。
何とかして前ページに移動したいのですが、
バインド後にしかエラーが発生しないので、
バインド前に毎回、DataViewのアイテム数より、
ページ数を計算するしかないのかなぁと思っています。
他に何か他に良い方法などありましたら、教えていただけないでしょうか?


NAL-6295さんご指摘ありがとうございます。
CurrentPageIndexは先頭が0から開始されます。

DataGridから1件ずつレコードを削除するときは以下のような処理で可能かと・・・
同時に複数のレコードを削除するときは
If dgrdCustomers.Items.Count = 1 Then
の箇所を変更してください。

コード:
Sub dgrdCustomers_DeleteCommand(s As Object, e As DataGridCommandEventArgs)
  If IsEditing Then
    Exit Sub
  End If
	
  Dim intCustomerID As Integer = Int32.Parse(CType(e.Item.FindControl("lblCustomerID"), Label).Text)
  Dim dr As DataRow = mdtCustomers.Rows.Find(intCustomerID)
	
  If Not (dr Is Nothing) Then		
    dr.Delete	
    dr.AcceptChanges()    
    Cache(mstrCacheKey) = mdtCustomers		
  End If

  If dgrdCustomers.Items.Count = 1 Then
    If dgrdCustomers.CurrentPageIndex > 0 Then  
      dgrdCustomers.CurrentPageIndex -= 1
    End If	
  End If  
  dgrdCustomers.EditItemIndex = -1	
  BindDataGrid()	  	
End Sub



すべてのソースコードは↓を参照してください
http://www.friendlysw.com/aspnet/Articles/Goto.aspx?id=030526-1

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
1

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