我终于找到了问题所在.
每个控件都在asp:Table中,我必须在此表上使用EnableViewState =“true”才能在回发后保留值.
谢谢大家的答案!
首先,请原谅我,如果我的英语不完美,但我会尽量做到最精确.
我从昨天开始就在解决我的问题,并一直在网上寻找答案.
我有一个表格,用于“创建新的个人资料”.在这种形式我有一些DropDownLists和TextBoxes,我的问题是关于DropDownLists.
4 DropDown在我的页面上.
让我们关注最后一个DropDown:
第一个DropDown根据其值动态填充第二个DropDown.
看到这张图:
http://image.noelshack.com/fichiers/2013/22/1369819471-picture-help.png
第一个ddl:
<asp:DropDownList ID="ddlTypePN" runat="server" DataSourceID="SqlTypePN" EnableViewState="true"
DataTextField="libelle" DataValueField="valeur" AutoPostBack="true" OnSelectedIndexChanged="ddlTypePN_SelectedIndexChanged"
OnDataBound="ddlTypePN_DataBound" > </asp:DropDownList>
第二个ddl:
<asp:DropDownList runat="server" ID="ddlFctPN" AppendDataBoundItems="false" OnDataBound="ddlFctPN_DataBound" > </asp:DropDownList>
填充方法:
void populateDdl()
{
string val = "fct"+ddlTypePN.SelectedValue.ToString().Trim(); // Used for SELECT
SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["My_DB"].ConnectionString);
ddlFctPN.Items.Clear();
DataTable subjects = new DataTable();
try
{
SqlDataAdapter adapter = new SqlDataAdapter("My SELECT", sqlConn);
adapter.Fill(subjects);
ddlFctPN.DataSource = subjects;
ddlFctPN.DataTextField = "libelle";
ddlFctPN.DataValueField = "valeur";
ddlFctPN.DataBind();
}
catch (Exception ex)
{
lblErr.Text = ex.Message;
}
ddlFctPN.Items.Insert(0, new ListItem("Sélectionnez...", "null"));
}
当我在第二个ddl中选择一个项目并且发生PostBack时(即使它来自我之前提到过的其他下拉列表),SelectedValue成为第一个值. ( “Selectionnez ……”)
似乎我的第二个DropDown在每个回发都受到限制,即使它不是因为我的第一个DropDown的SelectedIndexChanged.
SelectedIndexChanged第一个DropDown总是在回发时被调用,因此它会在每个PostBack上抛出“populateDdl()”(如果选择了一个值).
当我单击“提交”按钮时,它会在我的数据库中注册一个空白值.
我错过了什么?
编辑1:
这是PageLoad:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ddlTypeProf.DataBind(); // don't care
ddlSsoSrc.DataBind(); // don't care
ddlTypePN.DataBind(); // The ddl that populate my 2nd ddl
}
}
这是第一个ddl SelectedIndexChanged:
protected void ddlTypePN_SelectedIndexChanged(object sender, EventArgs e)
{
string type = ddlTypePN.SelectedValue.ToString().Trim();
// if PNT
if (type.ToUpper().Trim().Equals("PNT"))
{
ddlFctPN.Enabled = true;
ddlTypeAv.Enabled = true;
rfvTypeAv.Enabled = true;
populateDdl();
}
else if (type.ToUpper().Trim().Equals("PNC"))
{
ddlFctPN.Enabled = true;
ddlTypeAv.Enabled = false;
rfvTypeAv.Enabled = false;
populateDdl();
}
}
编辑2:
见下图:
http://image.noelshack.com/fichiers/2013/22/1369830738-help2.png
你可以看到我的第二个ddl(“Fonction”)被正确填充但是当我点击提交按钮时:该值变为空值(“Sélectionnez…”),因此我的RequiredFieldValidator使页面无效!
if(!IsPostBack)
{
populateDdl();
}
