【问题标题】:Server Event for HTML Select controlHTML Select 控件的服务器事件
【发布时间】:2017-09-07 22:42:47
【问题描述】:

如何为 HTML Select 控件添加服务器事件?

HTML 代码是这样的:

<div class="ui-widget">
    <select id="Select1" runat="server">
        <option>Select one...</option>
        <option>ActionScript</option>
        <option>AppleScript</option>
        <option>Asp</option>
        <option>BASIC</option>
    </select>
</div>

C#代码是这样的:

public void Select1_SomethingChange(object sender, EventArgs e)
{
    //random code
}

现在我知道它不起作用,HTML 的第二行需要某种属性。我已经尝试了唯一能找到的 2 个,即下面这两个

<select id="Select1" runat="server" onServerChanged="Select1_SomethingChange">
<select id="Select1" runat="server" onSelectedIndexChanged="Select1_SomethingChange">    

问题是第一个选项事件永远不会触发,而第二个选项不存在。请在这里帮助我,欢迎任何帮助。

【问题讨论】:

  • 如果您需要在服务器端访问它,为什么不使用DropDownList?它已经提供了一个SelectedIndexChanged 事件。
  • 我需要使用 Select 否则我无法拥有自动完成功能
  • @5tar-Kaster:你为什么不能? DropDownList 以 select 的形式呈现给客户端。它只是一个 ASP.NET 包装器,可提供您正在寻找的服务器端功能。
  • 如果它可以与jqueryui.com/autocomplete/#combobox 一起使用,请告诉我如何使用,因为我无法让它工作
  • @5tar-Kaster: This 问题表明它适用于 ASP.NET,here 是一个包含完整示例的博客。

标签: c# html events


【解决方案1】:

2013 年的答案相当保守。 select 元素具有 OnChange 事件,请参阅:this MS doc

代码隐藏中的事件处理程序仅在发布事件之后调用。对于 Asp 控件,您添加 AutoPostBack 属性,否则您只需调用 __doPostBack() javascript 方法。

完整示例:

<select id="select_clients" runat="server" 
   OnServerChange="SelectClients_Change" onchange="__doPostBack()">
</select>

代码隐藏:

using System.Web.UI.HtmlControls;//HtmlSelect

protected void SelectClients_Change(object sender, EventArgs e)
{
    HtmlSelect HS = sender as HtmlSelect;
    ListItem SelectedItem = HS.Items[HS.SelectedIndex];
}

注意:我在 Page_Load 中动态添加的选项是:

select_clients.Items.Add(new ListItem("...name...", "...value...")

为什么使用原始 html 元素和 __doPostBack 调用而不是更高级别的 Asp.Net 控件?好吧,有时这很方便,例如结合 Bootstrap 框架。

【讨论】:

    【解决方案2】:

    当您将runat="server" 添加到其他正常的HTML 元素时,它会在服务器端代码中变成HtmlControl。其中doesn't expose a lot of events。为了获得更丰富的服务器端事件,您需要使用 ASP.NET 控件。在这种情况下,这将是 DropDownList,has the events you're looking for。

    类似这样的:

    <div class="ui-widget">
        <asp:DropDownList id="Select1" OnSelectedIndexChanged="Select1_SomethingChange" runat="server">
            <asp:ListItem Selected="True" Value="White"> White </asp:ListItem>
            <asp:ListItem Value="Select one...">Select one...</asp:ListItem>
            <asp:ListItem Value="ActionScript">ActionScript</asp:ListItem>
            <asp:ListItem Value="AppleScript">AppleScript</asp:ListItem>
            <asp:ListItem Value="Asp">Asp</asp:ListItem>
            <asp:ListItem Value="BASIC">BASIC</asp:ListItem>
        </asp:DropDownList>
    </div>
    

    【讨论】:

    • 我昨晚尝试了这个,起初我认为它有效,但只有当你按下回车键时才会触发该事件......当你点击下拉菜单中的某些内容时它也需要触发。知道为什么没有吗?
    • @5tar-Kaster:具体来说,当代码回传到服务器时会触发该事件。如果您需要在所选索引更改时将代码回传到服务器,则可以在DropDownList 上设置AutoPostBack="true"。
    • 我已经尝试过了,但它不起作用,因为只有在编辑下拉列表时按下回车键才会触发该事件...当您单击一个项目时,我需要它触发
    • @5tar-Kaster:你能说得更具体点吗? AutoPostBack 应该导致 DropDownList 在它发生变化时发起一个发回服务器的帖子。如果没有,那么还有其他问题(我无法从这里调试)。如果确实如此,但您发现了其他问题,如果没有描述,我无法知道该问题是什么。
    • 我是否将它与jqueryui.com/autocomplete/#combobox 类型的组合框一起使用?这是我必须使用 Select 控件而不是 DropDownList 的最初原因
    猜你喜欢
    • 2011-05-22
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多