我已经阅读了一些不同的例子,对于那些不完全理解asp.net页面生命周期的人来说,这似乎是一个明显的新手问题,抱歉还在学习。我没有尝试修复过程。
ASPX:
...
<%
for( int j = 0; j < 11; j++)
{
ChildWeightPounds.Items.Add( new ListItem(j.ToString(),j.ToString()));
}
%>
<asp:DropDownList ID="ChildWeightPounds" runat="server" OnSelectedIndexChanged="DropDownListSelected">
<asp:ListItem Value="">-Select-</asp:ListItem>
</asp:DropDownList>
...
<asp:Button ID="InsertButton" runat="server" Text="Submit" OnClick="InsertButton_Click" />
aspx.cs:
protected void InsertButton_Click(object sender, EventArgs e)
{
foreach (Control c in NewPatientForm.Controls)
{
....
if (c is TextBox)
{
TextBox tb = (TextBox)c;
//Expected response:
Response.Write( "field: " + tb.ID + " = " + tb.Text + "<br />");
}
if (c is DropDownList)
{
DropDownList ddl = (DropDownList)c;
//Unexpected response:
//this is not giving me my selected value, but only the top item ("--select--")
Response.Write("field: " + ddl.ID + ", selectedItem: " + ddl.SelectedItem.Value + "<br />");
}
}
}
很明显这是一个IsPostBack,DataBind()问题,我对页面生命周期缺乏了解。但是没有意义的是,我正在遍历所有控件,文本框,复选框,复选框列表都工作正常,并在字段中给我值,由于某种原因,下拉列表没有给我这个值。 / p>
我尝试过使用OnSelectedIndexChanged事件,我尝试过使用DataBind()函数,但是玩这些函数仍然没有给我带来价值。
答案 0 :(得分:2)
您的示例中最大的问题是您在<% %>
页面中使用内联C#。 asp.net
不建议这样做。这更像是一种传统/经典的ASP方法,由于种种原因,它无法很好地与.NET配合使用。
尝试将从标记文件添加到dropdownlist
的项目的代码移动到.cs文件中,并确保挂钩在OnPreRender
之前或之前发生的页面事件。这是您可以更改页面控件并使viewstate / lifecycle正常工作的最后一点。
protected void Page_Load(object sender, EventArgs e)
{
for( int j = 0; j < 11; j++)
{
ChildWeightPounds.Items.Add( new ListItem(j.ToString(),j.ToString()));
}
}
如果没有运行您的示例,可能会在dropdownlist
中的错误时间将值插入lifecycle
,并且当您尝试访问后面代码中的选定值时它不起作用。
请考虑以下关于asp.net lifecycle的文章,它可以为您提供帮助。
答案 1 :(得分:1)
您可以调整DropDownList上的AutoPostBack="true"
,并定义OnSelecIndexChanged event
<asp:DropDownList ID="ChildWeightPounds" runat="server"
OnSelectedIndexChanged="DropDownListSelected" AutoPostBack="true>
<asp:ListItem Value="">-Select-</asp:ListItem>
</asp:DropDownList>
背后的代码
void DropDownListSelected(Object sender, EventArgs e)
{
var value = ChildWeightPounds.SelectedValue;
}