webforms:在javascript中动态添加下拉列表选项

webforms : add dynamically in javascript option to a dropdownlist

本文关键字:添加 下拉列表 选项 动态 javascript webforms      更新时间:2023-09-26

我正在开发一个asp.net网络表单应用程序。我的页面由2个下拉列表组成
在ddl1上的每次选择时,我都希望通过javascript将ddl1的选定元素动态添加到ddl2。默认情况下,第一次加载页面时,ddl1由3个元素(a、b、c)组成,ddl2仅由一个元素(a)组成。

<script>
function ddl1_handler()
{
   var ddl2 = document.getElementById("ddl2");
   var newOption = document.createElement("option");
   newOption.text = document.getElementById("ddl1").value;
   newOption.value = document.getElementById("ddl1").value;
   ddl2.add(option);
}
</script>
<asp:DropDownList ID="ddl1" runat="server" ClientIDMode="Static" onChange="ddl1_handler()">
</asp:DropDownList>
<asp:DropDownList ID="ddl2" runat="server" ClientIDMode="Static">
</asp:DropDownList>
<asp:Button ID="Button1" runat="server" Text="Button"  OnClick="Button1_Click"/>

这是我的代码_隐藏代码:

private List<string> choices = new List<string>() { "a", "b", "c"};
protected override void Render(HtmlTextWriter writer)
{
   foreach (var choice in choices)
   {
      Page.ClientScript.RegisterForEventValidation(ddl2.UniqueID, choice);
   }
   base.Render(writer);
}
protected void Page_Load(object sender, EventArgs e)
{
   if (!this.IsPostBack)
   {
      this.ddl1.Items.Clear();
      foreach (var choice in choices)
      {
        this.ddl1.Items.Add(new ListItem(){ Text = choice, Value = choice}); 
      }
      this.ddl2.Items.Clear();
      this.ddl2.Items.Add(new ListItem(){ Text = choices.First(), Value = choices.First()});
   }
}
protected void Button1_Click(object sender, EventArgs e)
{
        var selectedValue = this.ddl2.selectedValue;
}

使用以下代码,当我第一次加载页面时,ddl1由a、b、c组成,ddl2由a组成。然后我在ddl1上选择b,这个元素就会添加到ddl2中。我在ddl2上选择了这个元素,然后点击我的按钮。但当我到达button1_click处理程序时,我选择的值仍然是a,我不明白。

插入到客户端代码中的项不会持久化到代码隐藏中。您可以设置一个包含隐藏字段的机制来获取值,但我认为最简单的解决方案是在代码后面添加项,并使用UpdatePanel来避免刷新整个页面。

以下是如何使用它,显示了如何通过面板内外的控件触发更新:

<asp:ScriptManager ID="scriptManager1" runat="server">
</asp:ScriptManager>
...
<asp:UpdatePanel runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:DropDownList ID="ddl1" runat="server" AutoPostBack="true" onselectedindexchanged="ddl_SelectedIndexChanged" />
        <asp:DropDownList ID="ddl2" runat="server" />
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="ddl3" EventName="SelectedIndexChanged" />
    </Triggers>
</asp:UpdatePanel>
<asp:DropDownList ID="ddl3" runat="server" AutoPostBack="true" onselectedindexchanged="ddl_SelectedIndexChanged" />

由于UpdatePanel的属性ChildrenAsTriggers默认为true,因此ddl1中的选择将更新面板。另一方面,ddl3将具有类似的效果,因为它被注册为UpdatePanel的触发器。

ddl1ddl3都可以使用以下事件处理程序:

protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
    DropDownList ddl = sender as DropDownList;
    ListItem item = ddl.SelectedItem;
    ddl2.Items.Add(new ListItem(item.Text, item.Value));
    ddl.Focus();
}

请注意,ClientIDMode="Static"已被删除,因为它与UpdatePanels混合不好。

我在标记中包含了ScriptManager声明作为提醒,因为在使用UpdatePanels时它是必需的。