1

だから私はリピーターコントロールを怠惰にロードしています:

次のコードは、リピーターを、loadGuestbook() によって入力される guestbookData プロパティにバインドします。

public partial class _Default
{
    private DataTable _guestbookData;
    public DataTable guestbookData
    {
        get
        {
            if (_guestbookData == null)
            {
                _guestbookData = loadGuestbook();
            }
            return _guestbookData;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataBind();
        }
    }

    private DataTable loadGuestbook()
    {
        netguestData nd = new netguestData();
        List<post> data = nd.GetPosts(10, rptGuestbook.Items.Count);

        DataTable dt = new DataTable();
        // writing the list to a DataTable for bind happens here.
        // not sure how to cast IEnumerable to DataTable, else I'd do that

        return dt;
    }

    protected void btnLoadMore_Click(object sender, EventArgs e)
    {
        DataBind();
    }
}

データは、LINQ To SQL を使用してデータベースからクエリされます。私が使用している GetPosts(int, int) 関数は次のとおりです。

public class netguestData
{
    private netguestEntities ne = new netguestEntities();

    public netguestData()
    {

    }

    public List<post> GetPosts(int Take, int Skip)
    {
        var posts = (from p in ne.posts
                    .OrderByDescending(p => p.postdate)
                    .Take(Take)
                    .Skip(Skip)
                    select p).ToList();
        return posts;
    }
}

これをページングするには、基本的に 1 ページあたり 10 行をロードし、リピーターの項目数を参照して、選択したデータでスキップする行数を指定します。

ページが初めてロードされると、最初の 10 レコードは問題なく取得されますが、ボタンをクリックして次のセットをロードすると、空白になります。

デバッガーのメッセージは次のとおりです。

列挙しても結果が得られませんでした

Takeクリック後にとの値を確認しましたがSkip、予想どおり、両方とも 10 です。テーブルの行数が 200 行を超えているため、何が問題なのかわかりません。

これを修正するために私にできることを誰かが提案できますか?

前もって感謝します!

4

2 に答える 2

1

クエリを使用して理由を説明します。

    var posts = (from p in ne.posts
                .OrderByDescending(p => p.postdate)
                .Take(Take)
                .Skip(Skip)
                select p).ToList();

最初の試行では、10 件の投稿を取得し、それらの 10件のうち 0 件をスキップしています。次の試行では、10 件の投稿を取得し、そのうちの 10
件をスキップしています。これは明らかに結果ではありません。

書かれているように、常に最新の 10 件の結果をクエリしており、最初に 0 をスキップする場合を除いて、それらすべてをスキップしています。

@Becuzzが述べたように、スキップとテイクを交換したいだけなので、元のクエリから返された結果をスキップし、残りから取得します。

    var posts = (from p in ne.posts
                .OrderByDescending(p => p.postdate)
                .Skip(Skip)
                .Take(Take)
                select p).ToList();
于 2013-11-18T20:57:48.160 に答える