在FormView更新后,C#Dynamic创建的下拉列表未绑定

时间:2012-11-06 15:42:02

标签: c# formview html.dropdownlistfor

在更新sqldatasource或更改FormView模式后,我无法填充下拉列表。下拉列表是从后面的代码中的数组创建的。我将在下面发布代码片段。下拉列表会按预期绑定,直到这些事件发生。

为什么这不起作用的任何帮助都会很棒。

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ID" DataSourceID="tbl_PreRegistration"
    Width="100%" CssClass="c2wForm" DefaultMode="Edit">
<EditItemTemplate>
    <asp:DropDownList ID="stateDDL" runat="server" OnSelectedIndexChanged="State_DDL_SelectedIndexChanged"
                                CausesValidation="false" AutoPostBack="true">
                            </asp:DropDownList>
<asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update"
            Text="Update" CssClass="button blue" />
        &nbsp;<asp:LinkButton ID="btnReset" runat="server" CausesValidation="False"
             Text="Cancel" CssClass="button white" OnClick="btnReset1_Click" />
             </ContentTemplate></asp:UpdatePanel>
    </EditItemTemplate>
</asp:FormView>

背后的代码:

    protected void Page_Load(object sender, EventArgs e)
    {      

        if (!IsPostBack)
        {
            populateStateDDL("stateDDL", "CA");
        }
    }

protected void populateStateDDL(string DDL_ID, string getCurrentValue)
    {
        DropDownList strDDL_ID = (DropDownList)FormView1.FindControl(DDL_ID);
        ArrayList states = new ArrayList();


        strDDL_ID.DataValueField = "Value";
        strDDL_ID.DataTextField = "Text";
        strDDL_ID.DataSource = formating.GetAllStates();
        strDDL_ID.DataBind();
        strDDL_ID.SelectedValue = getCurrentValue.ToUpper();
    }

1 个答案:

答案 0 :(得分:0)

每次都需要创建控件,而不仅仅是在postback = false时。控件应该在Init事件中呈现,以便它可以连接到viewstate和所有其他webforms的东西。

这里有一些伪代码

private DropDownList ctrl;

protected override void Init(EventArgs e)
{
      base.Init(e);

      ctrl = new DropDownList
              {
                   Id = "name of control",
                   DataValueField = "Value", 
                   DataTextField = "Text"
              };

      Controls.Add(ctrl);
}

protected override void Load(EventArgs e)
{
      base.Load(e);

      if(ispostback) return;

      ctrl.DataSource = GetData();

      DataBind();
}