2008-10-24 16 views
19

काम नहीं कर रहा है, ऐसा लगता है कि एक सूची दृश्य नियंत्रण में पेजिंग जोड़ना आसान होना चाहिए, लेकिन यह मेरे लिए काम नहीं कर रहा है। सूची में ListView और DataPager नियंत्रण जोड़ने और उन्हें एक साथ तारों को जोड़ने के बाद, मुझे बहुत अजीब व्यवहार मिल रहा है। DataPager सूची दृश्य के पृष्ठ आकार को सही ढंग से सीमित करता है, लेकिन पेजिंग बटन पर क्लिक करने से ListView बिल्कुल प्रभावित नहीं होता है। पेजिंग बटन लगता है कि वे कर रहे हैं वे काम कर रहे हैं, क्योंकि अंतिम पृष्ठ पर जाने पर अंतिम बटन अक्षम होता है, लेकिन ListView कभी नहीं बदलता है। साथ ही, इसे कुछ भी करने के लिए डेटापेजर पर दो क्लिक लगते हैं, यानी, आखिरी बार क्लिक करने पर कुछ भी नहीं होता है, लेकिन दूसरी बार क्लिक करने से डेटापेजर प्रतिक्रिया करता है जैसे अंतिम पृष्ठ अब चुना गया है।DataPager के साथ ListView

एकमात्र चीज जो मैं सोच सकता हूं वह यह है कि मैं रनटाइम (LINQ ऑब्जेक्ट में) पर डेटासोर्स को बाध्य कर रहा हूं, लिंककटाससोर्स नियंत्रण या कुछ भी नहीं उपयोग कर रहा हूं। क्या किसी ने इस व्यवहार को देखा है? क्या मुझसे कुछ गलत हो रही है?

<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 

उत्तर

1

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; 
} 

हालांकि, मुझे अंतिम पृष्ठ देखने में समस्या है। डेटापेजर पहले पृष्ठ पर वापस कूदता है, लेकिन प्रदर्शित डेटा अंतिम पृष्ठ है।

28

हमें OnPreRender ईवेंट में फिर से सूची दृश्य डेटाबेस की आवश्यकता है।

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

--Update

asp.net ajax के साथ कुछ सूची दृश्य पर काम कर के बाद, मैं एक समाधान है कि ऊपर एक से अधिक समझ में आता है देखा। आप आम तौर पर पेज लोड विधि पर एक सूची क्लिक करें या एक बटन क्लिक इवेंट हैंडलर पर डेटा बाध्य करेंगे और जब समस्या वापस होती है तो डेटा बाध्यकारी समस्या में ऊपर वर्णित के रूप में खो जाएगा। इसलिए, हमें पृष्ठ दृश्यों पर फिर से डेटा बाध्य करने की आवश्यकता है, सूची दृश्य के लिए इवेंट हैंडलर बदल दिया गया है।

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

आप इसे DataBind को * फिर से की जरूरत नहीं है *। लेकिन हाँ, आप इस समस्या को प्रीरेंडर में डाटाबेसिंग द्वारा ठीक कर सकते हैं। –

+1

यह सबसे बेवकूफ चीज है जिसे मैंने कभी भी ASP.net से देखा है (हालांकि मुझे यकीन है कि इससे भी बदतर है)। लेकिन इसे खोजने के लिए धन्यवाद। मैंने कभी नहीं सोचा था कि एक pre_render बग होगा। – Dexter

+0

@ सैम जब मैं पूर्व रेंडर का उपयोग सूची को ओवरराइड करता हूं व्यू डेटासोर्स शून्य हो जाता है (अगले बटन पर क्लिक करने पर) और फिर कोई रिकॉर्ड प्रदर्शित नहीं होता है ... कोई अनुमान? – tariq

0

इसके अलावा, अगर अपने ListView के डेटा स्रोत बदल जाता है (जैसे खोजें मापदंडों के आधार पर डेटा प्रदर्शित करता है, तो), मत भूलना पेजर हर बार डेटा स्रोत अद्यतन किया जाता है पुनर्स्थापित करने के लिए।

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); 
     //} 
    } 
} 
1

बाइंड datapager के पूर्व में सूचीदृश्य पृष्ठ लोड पर नहीं घटना प्रस्तुत करना: एक ListView के साथ इस कुछ अन्य डेटा-बाउंड नियंत्रण (जैसे GridView) के रूप में के रूप में सरल नहीं है। कृपया देखें solution here

4

एक और समाधान, इसका सरल, बस, डाटाबेस से "आईडी" "क्वेरी-STRING" में जाओ अब के रूप में पेजर नियंत्रण संपत्ति [QueryStringField = "आईडी"] की तरह करने के लिए यह सेट करें:

<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> 

नोट: अगर woking नहीं, तो भी [ PagedControlID="ListView_Name" ] निर्धारित किया है।

+0

शानदार !!!!!! यह मेरी समस्या तय करता है जहां सब कुछ विफल हो गया था! – James

+0

यह उत्तर बिल्कुल समझ में नहीं आता है। – MC9000

0
<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 "> 

+0

क्या आप एक स्पष्टीकरण प्रदान कर सकते हैं? – CraigTeegarden

0

इस प्रयास करें:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e) 
{ 
    DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false); 
    ListView1.DataSource = productList; 
    ListView1.DataBind(); 
    DataPager1.DataBind(); 
}