0

LinqDataSourceのSelectingイベントを使用してFormViewのデータをフィルタリングしようとしていますが、正しくページに表示されないようです。FormViewに表示するレコードを1つだけ取得できますが、ページングコントロールが表示されません。LinqDataSourceSelectingイベントに次のコードがあります。

e.Arguments.StartRowIndex = 0;
e.Arguments.MaximumRows = 1;

var result = db.Personnels.AsQueryable();

if (!String.IsNullOrEmpty(txtFirstName.Text))
{
    result = result.Where(r => r.First_Name.Contains(txtFirstName.Text));
}

if (!String.IsNullOrEmpty(txtLastName.Text))
{
    result = result.Where(r => r.Last_Name.Contains(txtLastName.Text));
}

e.Arguments.TotalRowCount = result.Count();

e.Result = result.Skip(fvMain.PageIndex).Take(1);

上記のように、このコードは機能しますが、表示されるレコードは1つだけであり、ページングコントロールはFormViewに表示されません。私もe.Result次のように変更しようとしましたが、Object reference not set to an instance of an object.例外が発生します:

e.Result = result;

LinqDataSourceのselectingイベントを使用してFormViewをページングする正しい方法は何ですか?


編集1

要求に応じて、FormViewとLinqDataSourceのマークアップは次のとおりです。

<asp:FormView ID="fvMain" runat="server" CssClass="full" 
    DataKeyNames="Worker_ID" DataSourceID="ldsMain" DefaultMode="Edit" 
    AllowPaging="True" onitemupdating="fvMain_ItemUpdating">
    <EditItemTemplate>
        <table class="pad5 full">
            <tr>
                <td class="field-name" style="width: 100px">Worker ID:</td>
                <td style="width: 80px"><asp:TextBox ID="txtWorkerID" runat="server" Text='<%#Eval("Worker_ID") %>' ReadOnly="true" style="width: 75px" /></td>
                <td class="right"><input type="button" value="Injuries/LTA/WCB for this Person" onclick="openModalColorbox('Injuries.aspx?id='+$('#plcMain_fvMain_txtWorkerID').val(), 'Injuries')" /></td>
            </tr>
        </table>
        <table class="pad5 full">
            <tr>
                <td class="field-name">Type Of Person:</td>
                <td colspan="3">
                    <cc1:DataBindDropDownList ID="cboTypeOfPerson" runat="server" 
                        AppendDataBoundItems="True" DataSourceID="ldsPersonTypes" 
                        DataTextField="Type_of_Person" DataValueField="Type_of_Person" 
                        SelectedValue='<%#Bind("Type_Of_Person") %>'>
                        <asp:ListItem Text="" Value="" />
                    </cc1:DataBindDropDownList>
                    <asp:LinqDataSource ID="ldsPersonTypes" runat="server" 
                        ContextTypeName="PRIDE.PRIDEDataContext" EntityTypeName="" 
                        OrderBy="Type_of_Person" TableName="Personnel_Types">
                    </asp:LinqDataSource>
                </td>
            </tr>
            <tr>
                <td class="field-name">Employee Number:</td>
                <td><asp:TextBox ID="txtEmployeeNumber" runat="server" Text='<%#Bind("Employee_Number") %>' /></td>
                <td class="field-name">SIN:</td>
                <td><asp:TextBox ID="txtSIN" runat="server" Text='<%#Bind("SIN") %>' /></td>
            </tr>
            <tr>
                <td class="field-name">Last Name:</td>
                <td><asp:TextBox ID="txtLastName" runat="server" Text='<%#Bind("Last_Name") %>' /></td>
                <td class="field-name">Previous Last Name:</td>
                <td><asp:TextBox ID="txtPreviousLastName" runat="server" Text='<%#Bind("Previous_Last_Name") %>' /></td>
            </tr>
            <tr>
                <td class="field-name">First Name:</td>
                <td><asp:TextBox ID="txtFirstName" runat="server" Text='<%#Bind("First_Name") %>' /></td>
                <td class="field-name">Marital Status:</td>
                <td>
                    <cc1:DataBindDropDownList ID="DropDownList1" runat="server" 
                        AppendDataBoundItems="True" SelectedValue='<%# Bind("Marital_Status") %>' 
                        DataSourceID="ldsMaritalStatuses" DataTextField="Marital_Status" 
                        DataValueField="Marital_Status">
                        <asp:ListItem Text="" Value="" />
                    </cc1:DataBindDropDownList>
                    <asp:LinqDataSource ID="ldsMaritalStatuses" runat="server" 
                        ContextTypeName="PRIDE.PRIDEDataContext" EntityTypeName="" 
                        OrderBy="Marital_Status" TableName="List____Employee__Marital_Status">
                    </asp:LinqDataSource>
                </td>
            </tr>
            <tr>
                <td class="field-name">Division:</td>
                <td>
                    <cc1:DataBindDropDownList ID="cboDivision" runat="server" 
                        AppendDataBoundItems="True" SelectedValue='<%# Bind("Division") %>' 
                        DataSourceID="ldsDivisions" DataTextField="Division" 
                        DataValueField="Division">
                        <asp:ListItem Text="" Value="" />
                    </cc1:DataBindDropDownList>
                    <asp:LinqDataSource ID="ldsDivisions" runat="server" 
                        ContextTypeName="PRIDE.PRIDEDataContext" EntityTypeName="" GroupBy="Division" 
                        OrderBy="Division" Select="new (key as Division, it as Areas)" 
                        TableName="Areas">
                    </asp:LinqDataSource>
                </td>
                <td class="field-name">DOB:</td>
                <td>
                    <asp:TextBox ID="txtDOB" runat="server" Text='<%#Bind("DOB", "{0:dd MMM yyyy}") %>' />
                    <asp:CalendarExtender ID="CalendarExtender1" runat="server" TargetControlID="txtDOB" Format="dd MMM yyyy" />
                </td>
            </tr>
            <tr>
                <td class="field-name">Department:</td>
                <td>
                    <cc1:DataBindDropDownList ID="cboDepartment" runat="server" 
                        AppendDataBoundItems="True" SelectedValue='<%# Bind("Department") %>' 
                        DataSourceID="ldsDepartments" DataTextField="Department" 
                        DataValueField="Department">
                        <asp:ListItem Text="" Value="" />
                    </cc1:DataBindDropDownList>
                    <asp:LinqDataSource ID="ldsDepartments" runat="server" 
                        ContextTypeName="PRIDE.PRIDEDataContext" EntityTypeName="" GroupBy="Department" 
                        OrderBy="Department" Select="new (key as Department, it as Areas)" 
                        TableName="Areas">
                    </asp:LinqDataSource>
                </td>
                <td class="field-name">Terminated:</td>
                <td>
                    <cc1:DataBindDropDownList ID="cboTerminated" runat="server" 
                        SelectedValue='<%# Bind("Terminated") %>'>
                        <asp:ListItem Text="" Value="" />
                        <asp:ListItem Text="Yes" Value="Yes" />
                        <asp:ListItem Text="No" Value="No" />
                    </cc1:DataBindDropDownList>
                </td>
            </tr>
            <tr>
                <td class="field-name">Occupation:</td>
                <td>
                    <cc1:DataBindDropDownList ID="cboOccupation" runat="server" 
                        SelectedValue='<%# Bind("Occupation") %>' AppendDataBoundItems="True" 
                        DataSourceID="ldsOccupations" DataTextField="Occupation" 
                        DataValueField="Occupation">
                        <asp:ListItem Text="" Value="" />
                    </cc1:DataBindDropDownList>

                    <asp:LinqDataSource ID="ldsOccupations" runat="server" 
                        ContextTypeName="PRIDE.PRIDEDataContext" EntityTypeName="" OrderBy="Occupation" 
                        TableName="List____Employee__Occupations">
                    </asp:LinqDataSource>
                </td>
                <td class="field-name">Team:</td>
                <td>
                    <cc1:DataBindDropDownList ID="cboTeam" runat="server" 
                        SelectedValue='<%# Bind("Shift") %>' AppendDataBoundItems="True" 
                        DataSourceID="ldsShifts" DataTextField="Shift" 
                        DataValueField="Shift">
                        <asp:ListItem Text="" Value="" />
                    </cc1:DataBindDropDownList>

                    <asp:LinqDataSource ID="ldsShifts" runat="server" 
                        ContextTypeName="PRIDE.PRIDEDataContext" EntityTypeName="" OrderBy="Shift" 
                        TableName="List____Employee__Shifts">
                    </asp:LinqDataSource>
                </td>
            </tr>
            <tr>
                <td class="field-name">Lock Number:</td>
                <td><asp:TextBox ID="txtLockNumber" runat="server" Text='<%#Bind("Lock_Number") %>' /></td>
                <td class="field-name">Address:</td>
                <td><asp:TextBox ID="txtAddress" runat="server" Text='<%#Bind("Address") %>' /></td>
            </tr>
            <tr>
                <td class="field-name">City:</td>
                <td><asp:TextBox ID="txtCity" runat="server" Text='<%#Bind("City") %>' /></td>
                <td class="field-name">Company:</td>
                <td><asp:TextBox ID="txtCompany" runat="server" Text='<%#Bind("Company") %>' /></td>
            </tr>
            <tr>
                <td class="field-name">Province:</td>
                <td><asp:TextBox ID="txtProvince" runat="server" Text='<%#Bind("Province") %>' /></td>
                <td class="field-name">Company Contact:</td>
                <td><asp:TextBox ID="txtCompanyContact" runat="server" Text='<%#Bind("Company_Contact") %>' /></td>
            </tr>
            <tr>
                <td class="field-name">Postal:</td>
                <td><asp:TextBox ID="txtPostal" runat="server" Text='<%#Bind("Postal") %>' /></td>
                <td class="field-name">Phone:</td>
                <td><asp:TextBox ID="txtPhone" runat="server" Text='<%#Bind("Phone") %>' /></td>
            </tr>
            <tr>
                <td class="field-name">HCN:</td>
                <td><asp:TextBox ID="txtHCN" runat="server" Text='<%#Bind("HCN") %>' /></td>
                <td class="field-name">HCN Province:</td>
                <td><asp:TextBox ID="txtHCNProvince" runat="server" Text='<%#Bind("HCN_Province") %>' /></td>
            </tr>
            <tr>
                <td class="field-name">Comments:</td>
                <td colspan="3">
                    <asp:TextBox ID="txtComments" runat="server" Text='<%#Bind("Comments") %>' TextMode="MultiLine" Rows="3" />
                </td>
            </tr>
        </table>

        <h2>H.R.I.S.</h2>
        <table class="pad5 full">
            <tr>
                <td class="field-name">NOK Name:</td>
                <td><asp:TextBox ID="txtNOKName" runat="server" Text='<%#Bind("NOK_Name") %>' /></td>
                <td class="field-name">NOK Relation:</td>
                <td>
                    <cc1:DataBindDropDownList ID="cboNOKRelation" runat="server" 
                        SelectedValue='<%# Bind("NOK_Relation") %>' AppendDataBoundItems="True" 
                        DataSourceID="ldsNOKRelations" DataTextField="Relationship" 
                        DataValueField="Relationship">
                        <asp:ListItem Text="" Value="" />
                    </cc1:DataBindDropDownList>

                    <asp:LinqDataSource ID="ldsNOKRelations" runat="server" 
                        ContextTypeName="PRIDE.PRIDEDataContext" EntityTypeName="" 
                        OrderBy="Relationship" TableName="List____Employee__Relations">
                    </asp:LinqDataSource>
                </td>
            </tr>
            <tr>
                <td class="field-name">NOK Address:</td>
                <td><asp:TextBox ID="txtNOKAddress" runat="server" Text='<%#Bind("NOK_Address") %>' /></td>
                <td class="field-name">NOK City:</td>
                <td><asp:TextBox ID="txtNOKCity" runat="server" Text='<%#Bind("NOK_City") %>' /></td>
            </tr>
            <tr>
                <td class="field-name">NOK Province:</td>
                <td><asp:TextBox ID="txtNOKProvince" runat="server" Text='<%#Bind("NOK_Province") %>' /></td>
                <td class="field-name">NOK Postal:</td>
                <td><asp:TextBox ID="txtNOKPostal" runat="server" Text='<%#Bind("NOK_Postal") %>' /></td>
            </tr>
            <tr>
                <td class="field-name">NOK Phone:</td>
                <td><asp:TextBox ID="txtNOKPhone" runat="server" Text='<%#Bind("NOK_Phone") %>' /></td>
            </tr>
        </table>

        <div class="center">
            <asp:Button ID="btnSave" runat="server" Text="Save Changes" 
                onclick="btnSave_Click" />
        </div>
    </EditItemTemplate>
    <PagerSettings Mode="NextPreviousFirstLast" 
                FirstPageText="&amp;lt;&amp;lt; First" LastPageText="Last &amp;gt;&amp;gt;" 
                NextPageText="Next &amp;gt;" PreviousPageText="&amp;lt; Previous" 
                Position="TopAndBottom" />
            <PagerStyle CssClass="pager" />
</asp:FormView>
<asp:LinqDataSource ID="ldsMain" runat="server" 
    ContextTypeName="PRIDE.PRIDEDataContext" EnableDelete="True" 
    EnableInsert="True" EnableUpdate="True" EntityTypeName="" 
    TableName="Personnels" onselecting="ldsMain_Selecting">
    <UpdateParameters>
        <asp:Parameter ConvertEmptyStringToNull="true" Name="Employee_Number" />
    </UpdateParameters>
    <InsertParameters>
        <asp:Parameter ConvertEmptyStringToNull="true" Name="Employee_Number" />
    </InsertParameters>
</asp:LinqDataSource>
4

2 に答える 2

0

MSDNから、のAutoPageプロパティがデフォルトLinqDataSourceでに設定されていることがわかりtrueます。ドキュメントから:

AutoPageプロパティがtrueに設定されている場合、LinqDataSourceコントロールは、データバインドコントロールの1ページに十分なレコードのみを取得します。Skip<TSource>andメソッドを使用しTake<TSource>て、現在のページのレコードを取得します。

このすべての結果は、ページングを機能させるためにいくつかの変更が必要になるということです。

  1. 現在、設定していますe.Arguments.StartRowIndex = 0;。ページングに干渉するため、毎回これを行う必要はありません。
  2. する必要e.Result = result.Skip(fvMain.PageIndex).Take(1);もありません。大丈夫e.Result = result;なはずです。

これら2つの組み合わせが問題の原因だったと思います。ただし、フィルターの1つが作動する場合を処理する必要があります。

最初の問題は、以前に適用されたフィルターをViewStateに保持する必要があることです。そうしないと、フィルターが適用されたばかりで、それが既存のフィルターであるかどうかを判断できません。

Inspired by GridViewに接続されたlinqdatasourceにフィルターを適用した後、[編集]をクリックすると古いデータに戻り、ページにプロパティを追加します(名前に別のプロパティが必要になります)。

public string FirstNameFilter 
{
    get
    {
        return (string)this.ViewState["FirstNameFilter"] ?? string.Empty;
    }

    set
    {
        this.ViewState["FirstNameFilter"] = value;
    }
}

次に、Selectingイベントハンドラーで、次のコードを実行します。

var result = db.Personnels.AsQueryable();

if (!string.IsNullOrEmpty(txtFirstName.Text))
{
    if (this.FirstNameFilter != txtFirstName.Text)
    {
        this.FirstNameFilter = txtFirstName.Text;
        e.Arguments.StartRowIndex = 0;
    }

    if (!string.IsNullOrEmpty(this.FirstNameFilter))
    {
        result = result.Where(r => r.First_Name.Contains(txtFirstName.Text));
    }
}

if (!string.IsNullOrEmpty(txtLastName.Text))
{
    if (this.LastNameFilter != txtLastName.Text)
    {
        this.LastNameFilter = txtLastName.Text;
        e.Arguments.StartRowIndex = 0;
    }

    if (!string.IsNullOrEmpty(this.LastNameFilter))
    {
        result = result.Where(r => r.First_Name.Contains(txtLastName.Text));
    }
}

e.Arguments.TotalRowCount = result.Count();

e.Result = result;
于 2013-02-21T09:47:36.627 に答える
0

理由はわかりませんが、読み取り行をに変更することで問題が修正されe.Result = result...ましたe.Result = result.Skip(0)。その後、ページングは​​完全に機能します。

于 2013-02-21T18:07:35.927 に答える