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;
}
当我在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,您就不必担心它了。