6

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


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

表单中的 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;
}
4

9 回答 9

4

当我遇到 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 没有关闭。

于 2012-03-14T11:12:59.760 回答
1

这应该适合你。但是,我有点困惑为什么要将下拉列表传递给函数以获取状态。你有多个下拉菜单要填写吗?我认为我们需要查看您的 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();
 }
于 2012-03-08T14:27:29.907 回答
1

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

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

于 2012-03-08T14:35:54.483 回答
0

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

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

希望这可以帮助。

于 2012-03-16T11:30:29.387 回答
0

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

于 2012-03-15T21:27:44.833 回答
0

这可以帮助你:

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

例如,假设 States 类是这样指定的:

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

现在下拉列表应该绑定如下。在这里,对于每个州项,“Id”属性都是唯一的。

ddlStateList.DataSource = States;
ddlStateList.DataTextField = "Name";
ddlStateList.DataValueField = "Id";
ddlStateList.DataBind();
于 2012-03-14T19:03:10.547 回答
0

首先,您只需要在if( !IsPostBack ) { ...语句中填充和记录列表。

Next - Session["ddlState"] 永远不会被填充,不确定你想在哪里填充它,但你可以在你所说的更改的选定索引中进行。如果您没有在回发时调用 DataBind(),这应该可以工作。

于 2012-03-08T14:33:43.647 回答
0

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

于 2012-06-06T15:13:13.657 回答
0

这个怎么样:

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。

于 2012-03-13T08:39:27.570 回答