【问题标题】:DropDown List Selection下拉列表选择
【发布时间】:2011-01-19 18:03:45
【问题描述】:

我有三个下拉列表控件。每个下拉列表包含静态值 1、2、3、4 我需要做的是在第一个下拉列表中选择一个项目时(在 SelectedIndexChanged 事件上)应该在其他两个下拉列表中选择相同的项目

【问题讨论】:

    标签: asp.net drop-down-menu


    【解决方案1】:

    这就是你要做的。

    在 ASPX 代码中:

    <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddl_SelectedIndexChanged">
        <asp:ListItem Text="1" Value="1" />
        <asp:ListItem Text="2" Value="2" />
        <asp:ListItem Text="3" Value="3" />
        <asp:ListItem Text="4" Value="4" />
    </asp:DropDownList>
    <asp:DropDownList ID="DropDownList2" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddl_SelectedIndexChanged">
        <asp:ListItem Text="1" Value="1" />
        <asp:ListItem Text="2" Value="2" />
        <asp:ListItem Text="3" Value="3" />
        <asp:ListItem Text="4" Value="4" />
    </asp:DropDownList>
    <asp:DropDownList ID="DropDownList3" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddl_SelectedIndexChanged">
        <asp:ListItem Text="1" Value="1" />
        <asp:ListItem Text="2" Value="2" />
        <asp:ListItem Text="3" Value="3" />
        <asp:ListItem Text="4" Value="4" />
    </asp:DropDownList>
    

    在代码隐藏中:

    protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddl = (DropDownList)sender;
        string value = ddl.SelectedValue;
    
        SetValue(DropDownList1, value);
        SetValue(DropDownList2, value);
        SetValue(DropDownList3, value);
    }
    
    protected void SetValue(DropDownList ddl, string value)
    {
        ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(value));
    }
    

    只输入ddl1.SelectedValue = ddl2.SelectedValue 是行不通的,因为DropDownList.SelectedValue 是只读的。

    请注意,我不只是将所有 DDL 的 SelectedIndex 设置为发件人的。您可以在示例场景中使用它,但如果您的某个 DDL 的 ListItem 的顺序与其他 DDL 的顺序不同,则代码将中断。在我看来,这使它成为危险的做法,但是 YMMV。

    另外,如果您决定推广 SetValue 方法(我经常将其作为扩展方法添加到整个项目中的 DropDownList 控件),您应该处理在 DDL 中找不到目标值的情况,大概是通过抛出异常。您也可以使用 FindByText 制作 SetText 版本。

    【讨论】:

      【解决方案2】:

      将第二个和第三个下拉列表中的 selectedvalue 属性设置为第一个下拉列表中的选定值。将 DropDown 设置为 autopostback="true" 以便它回发到服务器,您可以适当地设置它。

      或者,当更改客户端事件第一次触发时,使用客户端 JavaScript 更改其他选择元素上的 selectedindex 属性。

      【讨论】:

        【解决方案3】:

        您需要做的就是设置其他下拉列表的SelectedIndex,如下所示:

        protected void DropDownList1SelectedIndexChanged(Object sender, EventArgs e)
        { 
           dropDownList2.SelectedIndex = dropDownList1.SelectedIndex;
           dropDownList3.SelectedIndex = dropDownList1.SelectedIndex;
        }
        

        【讨论】:

        • 忘了提...值在所有下拉列表中的顺序不同。所以这不起作用...
        【解决方案4】:

        尝试以下方法:

        标记:

        <asp:DropDownList ID="dd1" OnSelectedIndexChanged="dd1_SelectedIndexChanged" AutoPostBack="true" runat="server" />
        <asp:DropDownList ID="dd2" runat="server" />
        <asp:DropDownList ID="dd3" runat="server" />
        

        代码隐藏:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
                BindData();
        }
        
        protected void dd1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string selected = dd1.SelectedValue;
        
            dd1.SelectedValue = dd2.SelectedValue = dd3.SelectedValue = selected;
        
            BindData();
        }
        
        private void BindData()
        {
            int[] values = { 1, 2, 3, 4 };
        
            dd1.DataSource = dd2.DataSource = dd3.DataSource = values;
        
            dd1.DataBind();
            dd2.DataBind();
            dd3.DataBind();
        }
        

        【讨论】:

        • 我相信dd1.SelectedValue = dd2.SelectedValue 会导致错误,因为这是一个只读属性。
        • @Justin:不,不是。 msdn.microsoft.com/en-us/library/…。顺便说一句,我已经测试了我的代码。
        • 看来你是对的。我本可以发誓这给我最近的一个项目带来了问题,但也许我正在考虑别的事情。 +1 到您的链接,以向我展示我的方式错误。
        猜你喜欢
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-29
        • 1970-01-01
        相关资源
        最近更新 更多