动态填充DropDownList不会在回发ASP.net上保留值c#
编辑3:固定!
我终于找到了问题所在。 每个控件都在asp:Table中,我必须在此表上使用EnableViewState =“true”才能在回发后保留值。
谢谢大家的答案!
首先,请原谅我,如果我的英语不完美,但我会尽量做到最精确。 我从昨天开始就在解决我的问题,并一直在网上寻找答案。
我有一个“创建新配置文件”的表单。 在这种forms我有一些DropDownLists和TextBoxes,我的问题是关于DropDownLists。
4 DropDown在我的页面上。
让我们关注最后一个DropDown:
第一个DropDown根据其值动态填充第二个DropDown。
看到这张图片: http : //image.noelshack.com/fichiers/2013/22/1369819471-picture-help.png
第一个ddl:
第二个ddl:
填充方法:
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://sofzh.miximages.com/c%23/1369830738-help2.png
你可以看到我的第二个ddl(“Fonction”)被正确填充但是当我点击提交按钮时:该值变为空值(“Sélectionnez…”),因此我的RequiredFieldValidator使页面无效!
if(!IsPostBack) { populateDdl(); }
你在每个post中都是人口DD1
避免这种用途
if(!IsPostBack) { populateDdl(); }
将此代码置于此条件下
if(!Page.IsPostBack) { // Your Code Here }
你可以像以下一样使用CascadingDropDown :
从您的标记开始,您没有在第二个下拉列表中设置AutoPostBack属性。 因此,当第二个下拉索引发生更改时,它不应该回发消息(除非您以编程方式导致回发)。
我已将您的代码复制到我的解决方案中,它似乎表现得很……
而代码……
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ListItemCollection items = new ListItemCollection(); items.Add(new ListItem("PNT", "PNT")); items.Add(new ListItem("PNC", "PNC")); ddlTypePN.DataSource = items; ddlFctPN.DataBind(); ddlTypePN.DataBind(); // The ddl that populate my 2nd ddl ddlTypePN.Items.Insert(0, new ListItem("Sélectionnez...", "null")); } } 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; populateDdl(); } else if (type.ToUpper().Trim().Equals("PNC")) { ddlFctPN.Enabled = true; populateDdl(); } } protected void ddlTypePN_DataBound(object sender, EventArgs e) { } protected void ddlFctPN_DataBound(object sender, EventArgs e) { } void populateDdl() { ddlFctPN.Items.Clear(); lblErr.Visible = false; try { ListItemCollection items = new ListItemCollection(); items.Add(new ListItem("One", "1")); items.Add(new ListItem("Two", "2")); items.Add(new ListItem("Three", "3")); ddlFctPN.DataSource = items; ddlFctPN.DataBind(); } catch (Exception ex) { lblErr.Text = ex.Message; lblErr.Visible = true; } ddlFctPN.Items.Insert(0, new ListItem("Sélectionnez...", "null")); } }
经过几个小时试图找出类似的问题以及为什么我的下拉列表不会改变,我检查了我的数据,而DataTextField信息不同,DataTextValues是相同的,它只是每次拉第一个。 检查您的数据,看看它们是否有不同的值。
好的解决方案
// formulario aspx
Public Class WebTespRegionComuna Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not Page.IsPostBack Then 'ControlSystema.GetSearhRegionList(ddlRegion) Dim _ControlSystema As New ControlSystema With _ControlSystema .MtRegionList(ddlRegion) End With _ControlSystema = Nothing End If End Sub _ Public Shared Function GetProComunas(regionId As String) As List(Of ComunaList) Dim _ControlSystema As New ControlSystema Dim _lista As List(Of ComunaList) With _ControlSystema _lista = .GetSearchComunaList(regionId) End With _ControlSystema = Nothing Return _lista End Function Private Sub btnGuardarDatos_Click(sender As Object, e As System.EventArgs) Handles btnGuardarDatos.Click Try Dim valorcomuna As String = ddlComuna.SelectedValue valorcomuna = txtComunaHiden.Text Dim valorregion As String = ddlRegion.SelectedValue.ToString() Dim _valor As String = "punto de quiebre" Catch ex As Exception End Try End Sub End Class