Search code examples
c#.netformviewlinqdatasource

Filter FormView by Query String


I have a FormView wired up to a LinqDataSource that I'd like to filter by query string. Basically, if an ID is passed in through the query string, I'd like to only show that record, otherwise if no ID is supplied just show them all. I have managed to get this to work using a couple different methods, however every time I try to save the data in the FormView I'm getting the exception: Operator '==' incompatible with operand types 'Int32?' and 'Object'.

The above exception is raised when I call FormView.UpdateItem(true). Here is how I filter the LinqDataSource:

protected void ldsIncidents_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
    if (!String.IsNullOrEmpty(Request.QueryString["id"]))
    {
        e.Result = db.Incidents.Where(i => i.Incident_Number == Convert.ToInt32(Request.QueryString["id"]));
    }
}

The exception is thrown when I call FormView.UpdateItem(true). As soon as I remove the code from the Selecting event above, everything works as it should but I can no longer filter the data. I have also tried dynamically adding WhereParameters to the LinqDataSource, but the same thing happens. Does anybody know why this is happening or how to fix it? Here is my stack trace if it helps:

Exception Type: System.Web.Query.Dynamic.ParseException
Message: Operator '==' incompatible with operand types 'Int32?' and 'Object'
Stack Trace:
   at System.Web.Query.Dynamic.ExpressionParser.CheckAndPromoteOperands(Type signatures, String opName, Expression& left, Expression& right, Int32 errorPos)
   at System.Web.Query.Dynamic.ExpressionParser.ParseComparison()
   at System.Web.Query.Dynamic.ExpressionParser.ParseLogicalAnd()
   at System.Web.Query.Dynamic.ExpressionParser.ParseLogicalOr()
   at System.Web.Query.Dynamic.ExpressionParser.ParseExpression()
   at System.Web.Query.Dynamic.ExpressionParser.Parse(Type resultType)
   at System.Web.Query.Dynamic.DynamicExpression.ParseLambda(ParameterExpression[] parameters, Type resultType, String expression, Object[] values)
   at System.Web.Query.Dynamic.DynamicExpression.ParseLambda(Type itType, Type resultType, String expression, Object[] values)
   at System.Web.Query.Dynamic.DynamicQueryable.Where(IQueryable source, String predicate, Object[] values)
   at System.Web.UI.WebControls.DynamicQueryableWrapper.Where(IQueryable source, String predicate, Object[] values)
   at System.Web.UI.WebControls.QueryableDataSourceView.ExecuteQueryExpressions(IQueryable source, QueryContext context)
   at System.Web.UI.WebControls.QueryableDataSourceView.ExecuteQuery(IQueryable source, QueryContext context)
   at System.Web.UI.WebControls.LinqDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments)
   at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback)
   at System.Web.UI.WebControls.DataBoundControl.PerformSelect()
   at System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
   at System.Web.UI.WebControls.GridView.DataBind()
   at System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound()
   at System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls()
   at System.Web.UI.Control.EnsureChildControls()
   at System.Web.UI.WebControls.CompositeDataBoundControl.get_Controls()
   at System.Web.UI.WebControls.DataBoundControlHelper.ExtractValuesFromBindableControls(IOrderedDictionary dictionary, Control container)
   at System.Web.UI.WebControls.DataBoundControlHelper.ExtractValuesFromBindableControls(IOrderedDictionary dictionary, Control container)
   at System.Web.UI.WebControls.DataBoundControlHelper.ExtractValuesFromBindableControls(IOrderedDictionary dictionary, Control container)
   at System.Web.UI.WebControls.DataBoundControlHelper.ExtractValuesFromBindableControls(IOrderedDictionary dictionary, Control container)
   at System.Web.UI.WebControls.DataBoundControlHelper.ExtractValuesFromBindableControls(IOrderedDictionary dictionary, Control container)
   at System.Web.UI.WebControls.DataBoundControlHelper.ExtractValuesFromBindableControls(IOrderedDictionary dictionary, Control container)
   at System.Web.UI.WebControls.DataBoundControlHelper.ExtractValuesFromBindableControls(IOrderedDictionary dictionary, Control container)
   at System.Web.UI.WebControls.DataBoundControlHelper.ExtractValuesFromBindableControls(IOrderedDictionary dictionary, Control container)
   at System.Web.UI.WebControls.FormView.ExtractRowValues(IOrderedDictionary fieldValues, Boolean includeKeys)
   at System.Web.UI.WebControls.FormView.HandleUpdate(String commandArg, Boolean causesValidation)
   at System.Web.UI.WebControls.FormView.UpdateItem(Boolean causesValidation)
   at PRIDE.Pages.Incidents.View.btnSaveIncident_Click(Object sender, EventArgs e) in C:\Users\hopfnejo\Documents\Development Projects\PRIDE\PRIDE\Pages\Incidents\View.aspx.cs:line 317

EDIT

Here are the contents of the FormView's ItemUpdating event:

protected void fvIncident_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
    TabContainer tc = fvIncident.FindControl("tcMain") as TabContainer;

    e.NewValues["Division"] = (tc.Tabs[0].FindControl("cboDivision") as DropDownList).SelectedValue;
    e.NewValues["Safety"] = (tc.Tabs[0].FindControl("chkSafety") as CheckBox).Checked;
    e.NewValues["Quality"] = (tc.Tabs[0].FindControl("chkQuality") as CheckBox).Checked;
    e.NewValues["Cost"] = (tc.Tabs[0].FindControl("chkCost") as CheckBox).Checked;
    e.NewValues["Production"] = (tc.Tabs[0].FindControl("chkProduction") as CheckBox).Checked;
    e.NewValues["Environment"] = (tc.Tabs[0].FindControl("chkEnvironment") as CheckBox).Checked;
    e.NewValues["Department"] = (tc.Tabs[0].FindControl("cboDepartment") as DropDownList).SelectedValue;
    e.NewValues["Area"] = (tc.Tabs[0].FindControl("cboArea") as DropDownList).SelectedValue;
    e.NewValues["Initiated_By"] = (tc.Tabs[0].FindControl("txtInitiatedBy") as TextBox).Text;
    e.NewValues["KRA_Notes"] = (tc.Tabs[0].FindControl("txtKRANotes") as TextBox).Text;
    e.NewValues["Incident_type"] = (tc.Tabs[0].FindControl("cboIncidentType") as DropDownList).SelectedValue;
    e.NewValues["Aspect_Affected"] = (tc.Tabs[0].FindControl("cboAspectAffected") as DropDownList).SelectedValue;

    e.NewValues["Incident_Level"] = (tc.Tabs[1].FindControl("cboIncidentLevel") as DropDownList).SelectedValue;
    e.NewValues["ADM_Testing_Within_Guidelines"] = (tc.Tabs[1].FindControl("chkADMTestingWithinGuidelines") as CheckBox).Checked;
    e.NewValues["ADM_Testing_Required"] = (tc.Tabs[1].FindControl("chkADMTestingRequired") as CheckBox).Checked;
    e.NewValues["Number_Of_People_Involved"] = (tc.Tabs[1].FindControl("txtNumPeopleInvolved") as TextBox).Text;

    e.NewValues["Mill_State"] = (tc.Tabs[2].FindControl("cboMillState") as DropDownList).SelectedValue;
    e.NewValues["Area_Downtime"] = (tc.Tabs[2].FindControl("txtDowntime") as TextBox).Text;
    e.NewValues["Production_Amount_Lost"] = (tc.Tabs[2].FindControl("txtProductionAmountLost") as TextBox).Text;
    e.NewValues["Production_Actual_or_Estimate"] = (tc.Tabs[2].FindControl("cboProductionActualOrEstimate") as DropDownList).SelectedValue;
    e.NewValues["Production_Units"] = (tc.Tabs[2].FindControl("cboProductionUnits") as DropDownList).SelectedValue;

    e.NewValues["Environmental_Impact"] = (tc.Tabs[3].FindControl("txtEnvironmentalImpact") as TextBox).Text;
    e.NewValues["Environmental_Specialist_Notified"] = (tc.Tabs[3].FindControl("cboEnvironmentalSpecialistNotified") as DropDownList).SelectedValue;
    e.NewValues["Environmental_Incident_Reportable_to_Government"] = (tc.Tabs[3].FindControl("cboEnvironmentalIncidentReportableToGovernment") as DropDownList).SelectedValue;
    e.NewValues["Environmental_Governement_Agency_Involved"] = (tc.Tabs[3].FindControl("txtGovernmentAgencyInvolved") as TextBox).Text;
    if (String.IsNullOrEmpty((tc.Tabs[3].FindControl("txtDateReported") as TextBox).Text))
        e.NewValues["Environmental_Date_Reported"] = null;
    else
        e.NewValues["Environmental_Date_Reported"] = (tc.Tabs[3].FindControl("txtDateReported") as TextBox).Text;
    e.NewValues["Environmental_Action_Taken"] = (tc.Tabs[3].FindControl("txtEnforcementActionTaken") as TextBox).Text;
    e.NewValues["Environmental_Reference_Number"] = (tc.Tabs[3].FindControl("txtReferenceNumber") as TextBox).Text;

    e.NewValues["Procedures"] = (tc.Tabs[4].FindControl("txtProceduresAffected") as TextBox).Text;
    e.NewValues["Referances"] = (tc.Tabs[4].FindControl("txtReferences") as TextBox).Text;

    e.NewValues["Reviewed_By__BUL_"] = (tc.Tabs[8].FindControl("txtReviewedByBUL") as TextBox).Text;
    if (String.IsNullOrEmpty((tc.Tabs[8].FindControl("txtSignOffDateBUL") as TextBox).Text))
        e.NewValues["Sign_Off_Date__BUL_"] = null;
    else
        e.NewValues["Sign_Off_Date__BUL_"] = (tc.Tabs[8].FindControl("txtSignOffDateBUL") as TextBox).Text;
    if (String.IsNullOrEmpty((tc.Tabs[8].FindControl("txtPlannedReviewDate") as TextBox).Text))
        e.NewValues["Planned_Review_Date"] = null;
    else
        e.NewValues["Planned_Review_Date"] = (tc.Tabs[8].FindControl("txtPlannedReviewDate") as TextBox).Text;
    if (String.IsNullOrEmpty((tc.Tabs[8].FindControl("txtPlannedCompletionDate") as TextBox).Text))
        e.NewValues["Planned_Completion_Date"] = null;
    else
        e.NewValues["Planned_Completion_Date"] = (tc.Tabs[8].FindControl("txtPlannedCompletionDate") as TextBox).Text;
    e.NewValues["Signed_Off_By__BGL_"] = (tc.Tabs[8].FindControl("txtSignedOffByBGL") as TextBox).Text;
    if (String.IsNullOrEmpty((tc.Tabs[8].FindControl("txtSignOffDateBGL") as TextBox).Text))
        e.NewValues["Sign_Off_Date__BGL_"] = null;
    else
        e.NewValues["Sign_Off_Date__BGL_"] = (tc.Tabs[8].FindControl("txtSignOffDateBGL") as TextBox).Text;
    if (String.IsNullOrEmpty((tc.Tabs[8].FindControl("txtActualReviewDate") as TextBox).Text))
        e.NewValues["Actual_Review_Date"] = null;
    else
        e.NewValues["Actual_Review_Date"] = (tc.Tabs[8].FindControl("txtActualReviewDate") as TextBox).Text;
    if (String.IsNullOrEmpty((tc.Tabs[8].FindControl("txtActualCompletionDate") as TextBox).Text))
        e.NewValues["Actual_Completion_Date"] = null;
    else
        e.NewValues["Actual_Completion_Date"] = (tc.Tabs[8].FindControl("txtActualCompletionDate") as TextBox).Text;
    e.NewValues["Signed_Off_By__Mill_Manager_"] = (tc.Tabs[8].FindControl("txtSignedOffByMillManager") as TextBox).Text;
    if (String.IsNullOrEmpty((tc.Tabs[8].FindControl("txtSignOffDateMillManager") as TextBox).Text))
        e.NewValues["Sign_Off_Date__Mill_Manager_"] = null;
    else
        e.NewValues["Sign_Off_Date__Mill_Manager_"] = (tc.Tabs[8].FindControl("txtSignOffDateMillManager") as TextBox).Text;
}

EDIT 2

I have tried setting breakpoints in the only events I have handlers for related to the LinqDataSource and FormView, and none of the events are fired before the exception occurs. The events are:

  • LinqDataSource_Selecting
  • FormView_ItemUpdating
  • FormView_DataBound

None of my breakpoints are reached after clicking the Save button. It blows up here, not very useful:

Screenshot

Here is my FormView declaration:

<asp:FormView ID="fvIncident" runat="server" DefaultMode="Edit" 
    DataSourceID="ldsIncidents" DataKeyNames="Incident_Number" 
    AllowPaging="True" CssClass="full" ondatabound="fvIncident_DataBound" 
    onitemupdating="fvIncident_ItemUpdating">

And my LinqDataSource declaration:

<asp:LinqDataSource ID="ldsIncidents" runat="server" 
    ContextTypeName="PRIDE.PRIDEDataContext" EnableUpdate="True" EntityTypeName="" 
    TableName="Incidents" OrderBy="Incident_Number DESC" 
    onselecting="ldsIncidents_Selecting">
</asp:LinqDataSource>

Solution

  • Well, believe it or not this was solved by implementing the fix from this SO question. Microsoft desperately needs to fix this. I changed the pager settings to show only at the bottom of the FormView and poof quit complaining.