C# 如何根据用户在 ASP.NET 中的另一个下拉列表上的选择禁用下拉列表项?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 
原文地址: http://stackoverflow.com/questions/17114667/
Warning: these are provided under cc-by-sa 4.0 license.  You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I disable a dropdownlist item based on a user selection on another drop down in ASP.NET?
提问by RJ.
I have two drop down lists with a handful of items.
我有两个下拉列表,其中包含一些项目。
If the user selects X, X needs to be disabled from the next drop down.
如果用户选择 X,则需要从下一个下拉列表中禁用 X。
If the user selects Y, Y needs to be disabled from the next drop down.
如果用户选择 Y,则需要从下一个下拉列表中禁用 Y。
And vice-versa.
反之亦然。
I tried this but it is not working:
我试过这个,但它不起作用:
protected void ddlSearchColumn1_SelectedIndexChanged(object sender, EventArgs e)
{
    var ddl = (DropDownList) sender;
    string itemSelected = ddl.SelectedValue;
    ddlSearchColumn2.Items.FindByValue(itemSelected).Enabled = false;
}
Can anyone give me a hand?
谁能帮我一把?
采纳答案by user2453734
You were very close:
你非常接近:
MarkUP:
标记:
List 1: <asp:DropDownList ID="ddlSearchColumn1" runat="server" OnSelectedIndexChanged="ddlSearchColumn1_SelectedIndexChanged" AutoPostBack="true" />
List 2: <asp:DropDownList ID="ddlSearchColumn2" runat="server" AutoPostBack="true" />
Code Behind:
背后的代码:
public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {//JUST PUT SOMETHING IN THE DROPDOWN BOXES
            var items1 = new List<ListItem>()
            {
                new ListItem("Select Option"),
                new ListItem("Test 1"),
                new ListItem("Test 2"),
                new ListItem("Test 3")
            };
            var items2 = new List<ListItem>()
            {
                new ListItem("Select Option", ""),
                new ListItem("DDL 2 Test 1"),
                new ListItem("DDL 2 Test 2"),
                new ListItem("DDL 2 Test 3")
            };
            ddlSearchColumn1.DataSource = items1;
            ddlSearchColumn1.DataBind();
            ddlSearchColumn2.DataSource = items2;
            ddlSearchColumn2.DataBind();
        }
    }
    protected void ddlSearchColumn1_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList list = sender as DropDownList;
        if (list == null || list.SelectedValue.ToLower() != "test 1") // OR WHATEVER YOUR CRITERIA IS
            return;
        ddlSearchColumn2.Items.FindByValue("DDL 2 Test 1").Attributes.Add("Disabled", "Disabled");
    }
}
IF you are interested in a client side solution:
如果您对客户端解决方案感兴趣:
With jQuery:
使用 jQuery:
List 1: <asp:DropDownList ID="ddlSearchColumn1" runat="server" />
List 2: <asp:DropDownList ID="ddlSearchColumn2" runat="server" />
<script>
    jQuery('#<%= ddlSearchColumn1.ClientID %>').change(function ()
    {
        if (jQuery(this).val() != 'Test 1')//CHANGE YOUR CRITERIA
            return;
        jQuery('#<%= ddlSearchColumn2.ClientID %> option[value="DDL 2 Test 1"]').attr('disabled', 'disabled');
    });
</script>
Just using javascript no library:
只使用 javascript 没有库:
List 1: <asp:DropDownList ID="ddlSearchColumn1" runat="server" />
List 2: <asp:DropDownList ID="ddlSearchColumn2" runat="server" />
<script>
    document.getElementById('<%= ddlSearchColumn1.ClientID %>').onchange = function ()
    {
        var orgDdl = document.getElementById('<%= ddlSearchColumn1.ClientID %>');
        var org2ddl = document.getElementById('<%= ddlSearchColumn2.ClientID %>');
        if (orgDdl.value != 'Test 1')
            return;
        for (var i = 0, ii = org2ddl.options.length; i < ii; i++)
        {
            if (org2ddl.options[i].value == "DDL 2 Test 1")
            {
                org2ddl.options[i].disabled = "disabled";
                break;
            }
        }
    };
</script>
回答by brykneval
protected void ddlFirst_SelectedIndexChanged(object sender, EventArgs e)
    {
        foreach (ListItem item in ddlSecond.Items)
        {
            if (item.ToString() == ddlFirst.SelectedValue)
            {
                item.Attributes.Add("disabled", "disabled");
            }
        }
    }
    protected void ddlSecond_SelectedIndexChanged(object sender, EventArgs e)
    {
        foreach (ListItem item in ddlFirst.Items)
        {
            if (item.ToString() == ddlSecond.SelectedValue)
            {
                item.Attributes.Add("disabled", "disabled");
            }
        }
    }
But I still believe this is client side thing
但我仍然相信这是客户端的事情
回答by pseudocoder
The DropDownList contains a collection of ListItem objects, which have the property Enabled you are trying to set. This property works for ListItems in RadioButtonList or CheckBoxList controls, but NOT DropDownList.
DropDownList 包含 ListItem 对象的集合,这些对象具有您尝试设置的 Enabled 属性。此属性适用于 RadioButtonList 或 CheckBoxList 控件中的 ListItems,但不适用于 DropDownList。
MSDN reference: http://msdn.microsoft.com/en-us/library/vstudio/system.web.ui.webcontrols.listitem.enabled(v=vs.100).aspx
MSDN 参考:http: //msdn.microsoft.com/en-us/library/vstudio/system.web.ui.webcontrols.listitem.enabled(v= vs.100).aspx
"Note: You cannot use this property to disable a ListItem control in a DropDownList control or ListBox control."
“注意:您不能使用此属性禁用 DropDownList 控件或 ListBox 控件中的 ListItem 控件。”
Edit: Answers above solve your problem as you described, and I learned something new :)
编辑:上面的答案按照你的描述解决了你的问题,我学到了一些新东西:)
回答by RJ.
I figured I'd add here.
我想我会在这里添加。
Two things we forgot to add:
我们忘记添加两件事:
EnableViewState="True" AutoPostBack="True"
EnableViewState="True" AutoPostBack="True"
If you don't add those to the control, the event is not fired.
如果您不将这些添加到控件中,则不会触发该事件。
回答by hawk
For some reason, this worked for me:
出于某种原因,这对我有用:
 if (ddlState.SelectedValue == "AK")
    {
        MyDdl.Items.FindByValue("1111111").Enabled = false;
}
}

