1

datapagerのページを変更すると、完全なポストバックが発生します。datapagerが非常に異常に動作している場合でも、理由がわかりません。abnormaalyとは、データが表示される場合と表示されない場合があることを意味します。
以下は、C#のコードです。

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

    protected void StudentListView_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
    {
        BindListView();
    }
    private void BindListView()
    {
        StudentListView.DataSource = StudentDataSource;
        StudentListView.DataBind();
    }

    protected void StudentDataSource_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
    {
        e.Arguments.MaximumRows = StudentListDataPager.MaximumRows;
        e.Arguments.StartRowIndex = StudentListDataPager.StartRowIndex;
    }

以下は私のマークアップです

    <asp:UpdatePanel runat="server" UpdateMode="Conditional">
    <ContentTemplate>        <
    <asp:DropDownList runat="server" ID="BatchDropDownList" AutoPostBack="True">
        <asp:ListItem Text="Batch 1" Value="1" Selected="True" />
        <asp:ListItem Text="Batch 2" Value="2" />
    </asp:DropDownList>

    <asp:ListView ID="StudentListView" runat="server"       
        ItemPlaceholderID="ListViewContent" 
            EnableViewState="false" 
            onpagepropertieschanging="StudentListView_PagePropertiesChanging"> 
        <LayoutTemplate> 
            <table style="width:100%">
                <thead>
                    <tr>
                        <th class="align-left"><strong>Name</strong></th>
                        <th class="align-left"><strong>MobNo</strong></th>
                    </tr>
                </thead>
                <tbody runat="server" id="ListViewContent"> 
                </tbody>
                <tfoot>
                    <tr>
                        <td colspan="3">

                        </td>
                    </tr>
                </tfoot>
            </table>

        </LayoutTemplate>  
        <ItemTemplate>  

            <tr>
                <td style="width:70%;"><%# Eval("FirstName") %>&nbsp<%# Eval("LastName") %></td>
                <td style="width:30%;"><%# Eval("MobNo") %></td>                    
            </tr>

        </ItemTemplate>             
    </asp:ListView>
    <asp:DataPager ID="StudentListDataPager" runat="server" PageSize="5" PagedControlID="StudentListView">
        <Fields>
            <asp:NumericPagerField />
        </Fields>
    </asp:DataPager>


    <asp:ObjectDataSource ID="StudentDataSource" runat="server" 
        SelectMethod="GetStudentListBatchWise" SelectCountMethod="StudentCount" 
            TypeName="SCERPCommonUtil.Student" EnablePaging="True" 
            onselecting="StudentDataSource_Selecting">
        <SelectParameters>
            <asp:ControlParameter Name="batchId" ControlID="BatchDropDownList" PropertyName="SelectedValue" />
        </SelectParameters>
    </asp:ObjectDataSource>
    </ContentTemplate>
</asp:UpdatePanel>

間違いがあったら教えてください。

PS:私はそれらをすべて読んだので、stackoverflowの質問を指摘しないでください、そしてどれも私の要件に固有のものではありません、

私が直面している最も重要な問題は、同じことが起こったとしても、datapagerが完全なポストバックを提供しているdatapagerことです。updatepanel

4

2 に答える 2

0

条件付きにupdatemodeを指定しましたが、更新パネルにトリガーについて言及しました。AsyncPostBackTriggerを更新パネルに追加します

<asp:UpdatePanel runat="server" UpdateMode="Conditional">
<ContentTemplate> 
<Triggers>
            <asp:AsyncPostBackTrigger ControlID="StudentListView" EventName="PagePropertiesChanging" />
</Triggers>
<ContentTemplate>
</asp:UpdatePanel>

MSDNから: If the UpdateMode property is set to Conditional, and one of the following conditions occurs:

  1. UpdatePanelコントロールのUpdateメソッドを明示的に呼び出します。
  2. ポストバックは、UpdatePanelコントロールのTriggersプロパティを使用してトリガーとして定義されたコントロールによって発生します。このシナリオでは、コントロールはパネルコンテンツの更新を明示的にトリガーします。コントロールは、トリガーを定義するUpdatePanelコントロールの内側または外側に配置できます。
  3. ChildrenAsTriggersプロパティがtrueに設定され、UpdatePanelコントロールの子コントロールがポストバックを引き起こします。ネストされたUpdatePanelコントロールの子コントロールは、トリガーとして明示的に定義されていない限り、外部のUpdatePanelコントロールを更新しません。

更新された回答: リストビューでDataSourceID属性について言及していないのはなぜですか?

 <asp:ListView ID="StudentListView" runat="server"  DataSourceID  ="StudentDataSource"

そして、あなたはあなたのコードの後ろにあなたのリストビューをバインドしています

private void BindListView()
{
    StudentListView.DataSource = StudentDataSource; //also it should be DataSourceID 
    StudentListView.DataBind();
}

オブジェクトデータソースを使用していて、コードでそれを間違ったデータソースとしてバインドしています。データソースIDとしてバインドするか、listviewのdatasourceID属性に言及するだけで、コードビハインドでバインドする必要はありません。

于 2012-07-31T10:25:19.713 に答える
-1

私はそれを理解しました-誰かが見に来た場合に備えて-

私は<form runat="server">...<form>タグを使用していましたが、その中にこのすべてのリストビュー、データページャーコードが存在していました。フォームタグに一意のid属性を割り当てると、すべてが正しく機能し始めました。
私はそのような行動の理由を理解していませんが。

于 2012-08-28T21:13:22.197 に答える