【问题标题】:webforms : add dynamically in javascript option to a dropdownlistwebforms:在 javascript 选项中动态添加到下拉列表
【发布时间】:2016-08-25 15:45:16
【问题描述】:

我正在开发一个 asp.net webforms 应用程序。我的页面由 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"/>

这是我的 code_behind 代码:

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,我不明白。

【问题讨论】:

    标签: javascript c# jquery asp.net webforms


    【解决方案1】:

    插入到客户端代码中的项目不会保留在代码隐藏中。您可以设置 mechanism involving hidden fields 来取回值,但我认为最简单的解决方案是在代码隐藏中添加项目并使用 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" 已被删除,因为它不能与 UpdatePanel 很好地混合。

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

    【讨论】:

    • 感谢您的回答。我对网络表单完全陌生,我只有一个问题,如果我理解,我将我的 ddl1 放在 updatePanel 中,因为我想在不完全刷新的情况下触发回发,但为什么我还需要将 ddl2 也放入其中?
    • @user2443476 - 事实上,恰恰相反:ddl2 必须在 UpdatePanel 中才能在不更新整个页面的情况下进行更新,但 ddl1 可能在它之外并且仍然触发ddl2的更新。我修改了我的答案以显示如何使用控件ddl3 来完成它。最后,要检查 UpdatePanel 是否正常工作,您可以进行以下测试:在 UpdatePanel 内部添加一个 Label 并在其外部添加另一个,并在 ddl_SelectedIndexChanged 事件处理程序中更改它们的内容。你会看到只有面板内的 Label 被更新了。
    • 感谢您的帮助和明确的解释。
    • 所以我尝试了您的解决方案,一切正常。我只是不明白 ddl.focus 的用途。有没有没有区别。
    • 您可以注释掉ddl.Focus(),并在更改选择后查看ddl1ddl2 之间的行为差​​异。 IE 中的区别很明显:ddl1 显然失去了焦点。它在 Chrome 中也很明显(通过焦点轮廓),但在 Firefox 中不那么明显。但是,该行为表明焦点在所有浏览器中都丢失了:在ddl2 中进行选择后,您可以使用 Alt+Down 打开列表或使用 Down 键更改选择。它不适用于ddl1,除非您使用ddl.Focus()(或通过单击控件)将焦点放回原处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 2013-03-22
    相关资源
    最近更新 更多