我定义了DDL的aspx文件:
<asp:DropDownList ID="myDDL" runat="server"
OnSelectedIndexChanged="myDdlChange"
AutoPostBack="true" EnableViewState="true" />
我的代码隐藏在文件
之后protected void PopulateControl()
{
//populate my DDL based on an array (OK)
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
PopulateControl();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
...
this.DataBind();
}
protected void myDdlChange(object source, EventArgs e)
{
Session["myDDL"] = myDDL.SelectedValue;
myTextBox.Text = MyMethod(myDDL.SelectedValue);
}
myTextBox
是一个文本框,每当DDL通过将所选值作为参数的方法更改时,就会填充该文本框。
还需要为DDL添加更多内容以保持用户的选定值。 现在,当我切换到DDL中的另一个值时,我选择的值将切换回数组的第一个元素。
另外,当我调试并切换到DDL中的另一个值时,为什么myDdlChange
方法不会成为焦点? (我在这个方法中有一个断点)
答案 0 :(得分:3)
因为每次都这样做:
PopulateControl();
删除DropDownList中的所有值并重新添加它们。因此删除了用户选择的任何内容,并添加了一个新的(未选定的)值列表。每次页面加载时都会发生这种情况,这发生在myDdlChange
处理程序之前。
您可以阻止此操作重新填充邮寄后的列表:
if (!IsPostBack)
PopulateControl();
这样DropDownList仅在初始页面加载时填充,而不在后续的后页加载中填充。
另外,为什么myDdlChange方法在我调试并切换到DDL中的另一个值时不会成为焦点?
切换到其他值时是否回发到服务器?如果没有,那么没有什么是调用服务器端代码。如果要回发到服务器,是否已使用控件注册此事件?设计师通常会为您执行此操作,但如果您手动创建,则需要手动将其注册到控件中。