سؤال

ومن كل شيء لقد قرأت، ويبدو أن إضافة الترحيل إلى عنصر تحكم ListView يجب أن تكون بسيطة القتلى، لكنه لا يعمل بالنسبة لي. بعد إضافة يكون ListView والضوابط DataPager إلى النموذج والأسلاك معا، وأنا اتلقى السلوك الغريب للغاية. وDataPager يحد بشكل صحيح حجم الصفحة يكون ListView، ولكن النقر على أزرار الترحيل لا يؤثر يكون ListView على الإطلاق. يبدو أن أزرار الترحيل إلى يعتقدون أنهم يفعلون انهم العمل، كما يتم تعطيل الزر الأخير عندما تذهب إلى الصفحة الأخيرة، الخ، ولكن يكون ListView يتغير أبدا. أيضا، فإنه يأخذ اثنين من النقرات على DataPager لحملها على فعل أي شيء، أي الضغط على مرة واحدة آخر لا يفعل شيئا، ولكن النقر عليه مرة ثانية يؤدي DataPager للرد كما لو يتم تحديد الصفحة الأخيرة الآن.

والشيء الوحيد الذي يمكنني أن أفكر في أنني ملزم مصدر البيانات في وقت التشغيل (إلى كائن LINQ)، وعدم استخدام عنصر تحكم LinqDataSource ضوابط أو أي شيء. وقد أي شخص ينظر إلى هذا السلوك؟ أفعل شيئا خاطئا؟ هنا هو رمز أنا باستخدام:

<asp:DataPager ID="HistoryDataPager" runat="server" PagedControlID="HistoryListView" PageSize="10">
    <Fields>
        <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="true" ShowLastPageButton="true" />
    </Fields>
</asp:DataPager>

<asp:ListView ID="HistoryListView" runat="server">
    ...
</asp:ListView>

في التعليمات البرمجية الخلفية:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        HistoryListView.DataSource = From x in myContext.myTables ...
        DataBind()
    End If

End Sub
هل كانت مفيدة؟

المحلول

ونلقي نظرة على ListViewPagedDataSource.

private ListViewPagedDataSource GetProductsAsPagedDataSource(DataView dv)
{
// Limit the results through a PagedDataSource
ListViewPagedDataSource pagedData = new ListViewPagedDataSource();
pagedData.DataSource = dv;
pagedData.MaximumRows = dv.Table.Rows.Count;
pagedData.TotalRowCount = dpTop.PageSize;

if (Request.QueryString[dpTop.QueryStringField] != null)
  pagedData.StartRowIndex = (Convert.ToInt32(Request.QueryString[dpTop.QueryStringField]) - 1) * dpTop.PageSize;
else
  pagedData.StartRowIndex = 0;

return pagedData;
}

ورغم ذلك، لدي مشكلة عرض الصفحة الأخيرة. وDataPager يقفز إلى الصفحة الأولى، ولكن البيانات المعروضة في الصفحة الأخيرة.

نصائح أخرى

ونحن بحاجة إلى DataBind عناصر عرض القائمة مرة أخرى في حالة OnPreRender.

protected override void OnPreRender(EventArgs e)
        {
            ListView1.DataBind();
            base.OnPreRender(e);
        }

- تحديث

وبعد العمل على عدد قليل من قائمة وجهات النظر مع اياكس asp.net، رأيت حل منطقي أكثر من واحد أعلاه. تفعل عادة بيانات ربط Listview على طريقة تحميل الصفحة أو انقر فوق زر معالج الحدث وعندما يكون هناك إضافة إلى الوراء البيانات سوف تضيع كما هو موضح أعلاه في مشكلة ملزمة. لذلك، نحن بحاجة إلى ربط البيانات مرة أخرى على خصائص الصفحة تغيرت معالج الحدث لعرض القائمة.

ListView_PagePropertiesChanged(object sender, EventArgs e)
{
ListView.DataSource=someDatasource;
ListView.DataBind()
}

<القوي> واحد مزيدا من الحل ، أو لها بسيط، مجرد الحصول على "ID" في "استعلام STRING" من قاعدة البيانات، الآن تعيينها إلى الملكية بيجر تحكم باسم [QueryStringField = "ID"] مثل:

<asp:DataPager ID="DataPagerProducts" runat="server" QueryStringField="ID" PageSize="3">
                            <Fields>
                                <asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" />
                                <asp:NumericPagerField />
                                <asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" />
                            </Fields>
                        </asp:DataPager>

<قوية> ملاحظة: إذا لم وكينغ، ثم أيضا تعيين [ PagedControlID="ListView_Name" ]

وربط يكون ListView في datapager ما قبل تقديم الحدث ليس في تحميل الصفحة. يرجى الاطلاع على حل هنا

وبالإضافة إلى ذلك، إذا تم تغيير مصدر البيانات من ListView الخاص بك (على سبيل المثال، إذا عرض البيانات استنادا إلى معايير البحث)، لا ننسى لإعادة النداء في كل مرة يتم تحديث مصدر البيانات. مع ListView هذه ليست واضحة مثل بعض عناصر تحكم ربط البيانات الأخرى (على سبيل المثال GridView):

private void ResetListViewPager()
{
    DataPager pager = (DataPager)ListViewMembers.FindControl("DataPager1");
    if (pager != null)
    {
        CommandEventArgs commandEventArgs = new CommandEventArgs(DataControlCommands.FirstPageCommandArgument, "");
        // MAKE SURE THE INDEX IN THE NEXT LINE CORRESPONDS TO THE CORRECT FIELD IN YOUR PAGER
        NextPreviousPagerField nextPreviousPagerField = pager.Fields[0] as NextPreviousPagerField;
        if (nextPreviousPagerField != null)
        {
            nextPreviousPagerField.HandleEvent(commandEventArgs);
        }

        // THIS COMMENTED-OUT SECTION IS HOW IT WOULD BE DONE IF USING A NUMERIC PAGER RATHER THAN A NEXT/PREVIOUS PAGER
        //commandEventArgs = new CommandEventArgs("0", "");
        //NumericPagerField numericPagerField = pager.Fields[0] as NumericPagerField;
        //if (numericPagerField != null)
        //{
        //    numericPagerField.HandleEvent(commandEventArgs);
        //}
    }
}
<asp:ListView ID="ListView1" runat="server" DataSourceID="sdsImages">
    <ItemTemplate>
        <div class="photo sample12">
                <asp:Image ID="img_Galerie" runat="server" ImageUrl='<%# "~/imageHandler.ashx?ID=" + Eval("ImageID") %>' />
        </div>
    </ItemTemplate>
</asp:ListView>
<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" PageSize="3" QueryStringField="ImageID">
    <Fields>
        <asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" />
        <asp:NumericPagerField />
        <asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" />
    </Fields>
</asp:DataPager>
<asp:SqlDataSource ID="sdsImages" runat="server"
    ConnectionString="<%$ ConnectionStrings:DBCS %>"
    SelectCommand="SELECT ImageID FROM  Images ">

وحاول هذا:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
    DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
    ListView1.DataSource = productList;
    ListView1.DataBind();
    DataPager1.DataBind();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top