Search code examples
asp.netformview

Why would formview disappear in Edit Mode


I know I must be missing something simple but I cannot find it so I will pose the question here. I have a formview with two templates (item and edititem).

The form is bound to the itemtemplate in the page_Load event and works fine. However, if is use !IsPostBack in the code-behind, the formview disappears when the edit button is clicked. If I remove the postback check from page_load, then the form view appears after the edit button is clicked.

The page does have viewstate enabled.

In general, what steps are needed to get the formview to transition between modes correctly?

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        source = Session["Source"].ToString();
        acctType = Session["AccountType"].ToString();
        acctNumber = Convert.ToInt32(Session["AccountNumber"]);

        if (source == "LifeLineDS")
        {
            ObjectDataSource fvObjDS = new ObjectDataSource();
            fvObjDS.TypeName = "LifelineDataAccess.LifelineSubscriber";
            fvObjDS.SelectMethod = "GetLifelineDSSubscriber";

            fvObjDS.SelectParameters.Add(new Parameter("AcctType", TypeCode.String, acctType));
            fvObjDS.SelectParameters.Add(new Parameter("AcctNumber", TypeCode.String, Session["AccountNumber"].ToString()));
            fvObjDS.DataBind();

            if (fvObjDS != null)
            {
                fvSubscriber.DataSource = fvObjDS;  //subscriber.ToString();
                fvSubscriber.DataBind();

                initialProgramValue = (fvSubscriber.FindControl("txtEligibility") as TextBox).Text;
            }                
        }
// more code for other sources...
}

protected void btnEdit_Click(object sender, EventArgs e)
{
    fvSubscriber.ChangeMode(FormViewMode.Edit);
    fvSubscriber.DataSource = Session["subscriber"];  //Adding this line resolved !IsPostBack problem
    fvSubscriber.DataBind();

    ObjectDataSource programsObjDS = new ObjectDataSource();
    programsObjDS.TypeName = "LifelineDataAccess.LifelineSubscriber";
    programsObjDS.SelectMethod = "GetPrograms";

    DropDownList ddlEligibility = ((DropDownList)(fvSubscriber.FindControl("ddlEligibility")));

    if (ddlEligibility != null)
    {
        ddlEligibility.DataSource = programsObjDS;
        ddlEligibility.DataTextField = "ProgramName";
        ddlEligibility.DataValueField = "ProgramName";

        ddlEligibility.SelectedValue = initialProgramValue; // Set selected value to subscribers current program
        ddlEligibility.DataBind();
    }
} 

Solution

  • This

    fvSubscriber.ChangeMode(FormViewMode.Edit);
    fvSubscriber.DataBind();
    

    seems to not to set the data source. The rule is that either you have the DataSourceID set in the declarative part of your code (*.aspx, *.ascx) and the binding is done automatically upon each postback OR you bind programmatically which involves setting the data source and calling the DataBind().

    My recommendation would be to move your ObjectDataSource to the declarative part of the code and set the DataSourceID on the FormView to the ID of the ObjectDataSource. This is clean and easy and the binding works always.