c#ASP.Net动态填充的DropDownList在提交按钮上丢失选定的索引

本文关键字:索引 按钮 提交 动态 Net 填充 DropDownList c#ASP | 更新日期: 2023-09-27 18:27:05

我在PageLoad上从ArrayList动态填充所有50个状态的下拉列表。当用户选择"提交"按钮(btnSubmit_Click事件)时,下拉列表控件的SelectedIndex属性始终为0,而不管用户选择了什么选项。


添加了更多代码以帮助进行故障排除。从会话变量(bbb)和ddlState.selectedindex(bbb

HTML代码格式:

<asp:DropDownList ID="ddlState" runat="server" AutoPostBack="True" 
    onselectedindexchanged="ddlState_SelectedIndexChanged" >
</asp:DropDownList>

代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{
    //------------------------------------------------
    // Populates state dropdownlists
    //------------------------------------------------
    if (!IsPostBack)
    {
        GetAllStatesForDdl(ddlDLState);
        GetAllStatesForDdl(ddlOldState);
        GetStatesForDdl(ddlState);
    }
}
private void GetAllStatesForDdl(DropDownList ddlStateList)
{
    AppInputFormProcessor getStates = new AppInputFormProcessor();
    ArrayList States = new ArrayList();
    States = getStates.GetAllStates();
    ddlStateList.DataSource = States;
    ddlStateList.DataBind();
}
private void GetStatesForDdl(DropDownList ddlStateList)
{
    AppInputFormProcessor getStates = new AppInputFormProcessor();
    ArrayList States = new ArrayList();
    States = getStates.GetStates();
    ddlStateList.DataSource = States;
    ddlStateList.DataBind();
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
    int aaa = ddlState.SelectedIndex;
    int bbb = Convert.ToInt32(Session["ddlState"]);
}
protected void ddlState_SelectedIndexChanged(object sender, EventArgs e)
{
    Session["ddlState"] = ddlState.SelectedIndex;
}

c#ASP.Net动态填充的DropDownList在提交按钮上丢失选定的索引

当我在ViewState中遇到问题时(我怀疑这是您的情况),我使用它将数据恢复到动态填充的下拉对象

    public void Page_Load(object sender, EventArgs e){
            if (!IsPostBack)
            {
                Databind();
            }
            else {
                LoadAllViewStates();
            }
    }
    private void Databind()
        {
            DataTable questionnaireDT = null;
            DataTable questionsDT = null;
            DataTable indicatorDT = null;
            DataView tempView = QuestionnaireDS.Select(DataSourceSelectArguments.Empty) as DataView;
            questionnaireDT = tempView.Table;
            ViewState["QuestionnaireDL"] = questionnaireDT;
            QuestionnaireDL.DataSource = ViewState["QuestionnaireDL"];
            QuestionnaireDL.DataBind();
            tempView = QuestionDS.Select(DataSourceSelectArguments.Empty) as DataView;
            questionsDT = tempView.Table;
            ViewState["QuestionList"] = questionsDT;
            QuestionList.DataSource = ViewState["QuestionList"];
            QuestionList.DataBind();
            tempView = IndicatorDS.Select(DataSourceSelectArguments.Empty) as DataView;
            indicatorDT = tempView.Table;
            ViewState["IndicatorLst"] = indicatorDT;
            IndicatorLst.DataSource = ViewState["IndicatorLst"];
            IndicatorLst.DataBind();
        }
        private void LoadAllViewStates()
        {
            QuestionnaireDL.DataSource = ViewState["QuestionnaireDL"];
            QuestionnaireDL.DataBind();
            QuestionList.DataSource = ViewState["QuestionList"];
            QuestionList.DataBind();
            IndicatorLst.DataSource = ViewState["IndicatorLst"];
            IndicatorLst.DataBind();
        }

为了恢复选定的索引,我将selectedIndex传递到一个隐藏字段中。

希望这有帮助?

顺便问一下,为什么要将DropDownList对象作为参数传入?而是调用一个无参数函数,并在函数中填充DropDownList对象。

此外,请确保ViewState未关闭。

在您的示例中,您试图从会话变量中获取选定的值,但没有显示实际设置会话中任何内容的代码。

即使您有某种设置会话变量的异步调用,这也是一种非常危险的做法:一旦有人打开第二个选项卡,您就有可能发生数据损坏。

这应该对您有效。然而,我有点困惑,为什么要将下拉列表传递给函数以获取状态。您有多个下拉列表需要填写吗?我想我们需要看看你的html才能有更多的帮助。

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
        GetStatesForDdl(ddl);
}
 private void GetStatesForDdl(DropDownList ddlStateList)
 {
     AppInputFormProcessor getStates = new AppInputFormProcessor();
     ArrayList States = new ArrayList();
     States = getStates.GetStates();
     ddlStateList.DataSource = States;
     ddlStateList.DataBind();
 }

首先,您只需要在if( !IsPostBack ) { ...语句中填充列表并对其进行数据处理。

Next-会话["ddlState"]从未被填充,不确定您想在哪里填充,但您可以在所选索引中进行填充,如您所述。如果您没有在回发时调用DataBind(),这应该会起作用。

这个怎么样:

protected void GetStatesForDdl(DropDownList ddlStateList)
{
    //remove event handler
    ddlStateList.SelectedIndexChanged -= new EventHandler(ddlState_SelectedIndexChanged);
    //business as usual
    AppInputFormProcessor getStates = new AppInputFormProcessor();
    ArrayList States = new ArrayList();
    States = getStates.GetStates();
    ddlStateList.DataSource = States;
    ddlStateList.DataBind();
    // then force it to select desired index
    ddlStateList.SelectedIndex = (int)Session["ddlState"];
   //ok, stick it back to control
   ddlStateList.SelectedIndexChanged += new EventHandler(ddlState_SelectedIndexChanged);
}

我建议在ViewState中使用局部变量而不是Session,在SelectedValue中使用SelectedIndex。

这可以帮助您:

绑定下拉列表时,请指定DataTextField和DataValueField属性。在提交期间将所选索引获取为0的原因是,下拉列表中不包含与其中每个项关联的唯一值。请记住,在DataValueField中指定的属性应该是唯一的。即,下拉列表中的每个项目都应该是唯一可识别的。

例如,考虑States类是这样指定的:

public class State
{
    public string Name { get; set; }
    public string Id { get; set; }
}

现在,下拉列表应该按照下面给出的方式进行绑定。此处,对于每个States Item,"Id"属性都是唯一的。

ddlStateList.DataSource = States;
ddlStateList.DataTextField = "Name";
ddlStateList.DataValueField = "Id";
ddlStateList.DataBind();

如果禁用ViewState,则必须将SelectedIndex保存到会话中,并且在Page_Load上,始终重新加载数据并直接设置索引。绑定数据源时,将索引作为默认索引的参数发送(来自会话),并在调用DataBind()后将SelectedIndex设置为此数字。

当你说你不使用ViewState时,是不是意味着你已经为页面或下拉列表禁用了它?这可能是你的问题。我知道很多人问过你这个问题,但我看不到你的任何答案来表明你是否在使用viewstate。当你的用户做出选择并且你的页面发回时,你仍然需要查看状态,这样你的页面即使在发回后也知道用户选择了什么。然后由您将其保存在会话或视图状态中。

另一方面,如果您的视图状态已启用,请在新页面上添加一段代码,以查看问题何时开始出现。记住不要触摸视图状态并使用默认状态。首先,添加一个带有下拉列表和按钮的页面,并将其绑定到2个伪值,然后在返回后读取用户选择。随着您不断添加更多的代码和控件,如果问题再次出现,您将能够找出哪行代码让您感到悲伤。

希望这能有所帮助。

如果在OnInit中绑定下拉列表项,所有视图状态都将由框架自动处理。如果在Page_Load中绑定它,则在应用视图状态之后才添加它们。将其移动到OnInit,您就不必担心它了。