@adam0101の応答の詳細に答えるために、彼が「...カスタムデータソースがレコードカウントに対してゼロを返していることが判明しました。」とは、データソースをグリッドビューに「再アタッチ」する必要があるかもしれないということです。. ASP.net は、レコード「n」を取得していることを自動的に認識します。ここで、「n」は次のページの次の最初の行です。このソリューションは、asp.net にデータの自動処理を許可したくない場合に適しています。おそらく、ページが初めて読み込まれたときではなく、別のイベント (たとえば、[データの読み込み] ボタン) の後にデータを読み込みたいためです。しかし、Adam が以下で述べたように、本当の理由は「... ObjectDataSource を継承するデータソース サブクラスを作成しましたが、正しく実装されていませんでした。」. アダムの仮定で申し訳ありません。ありがとう
ただし、私のソリューションの残りの部分は、手動で派生したデータ ソースの使用に固執している人には有効だと思います。
すなわち
上記のように GridView を設定し、注意してください - DataSource プロパティなしで! これが私の例です:
<asp:GridView ID="gvStudents" DataKeyNames="StudentID" runat="server"
ShowFooter="True" AutoGenerateColumns="False" Width="100%" AllowSorting="True" AllowPaging="true" PageSize="10" OnPageIndexChanging="gvStudents_PageIndexChanging">
次に、グリッドビューを新しいページに強制する必要があるときにいつでも呼び出すことができるプライベート メソッドまたはルーチンを作成します。
private void BindGridViewServer(GridView gv1)
{
gv1.DataSource = sdsStudents; //re-attach the datasource
gv1.DataBind(); //get a page of data AllowPaging must be true
}
次に、OnPageIndexChanging
メソッドを作成します。
protected void gvStudents_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView myGV = (GridView)sender;
myGV.PageIndex = e.NewPageIndex;
BindGridViewServer(myGV);
}
この回答を完成させるために、デフォルトであるPostPackが起動されたときではなく、必要なときにデータをロードするコードを次に示します...
protected void btnSEARCH(object sender, EventArgs e)
{
//some code
//bind the gridview to the datasource here and then bind!
gvStudents.DataSource = sdsStudents;
gvStudents.DataBind();
//more code etc
}