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