繁体   English   中英

从组合框列表中选择两个组合框中的值?

[英]Select Values from two combobox from a list of combobox?

我在表单上放置了六个组合框,同时我希望用户可以从最多两个组合框中选择值。 为此,我有一个计数器变量,每当组合框的selectedindex更改但未达到解决方案时,该变量都会增加。

你们能解释我该怎么做吗?

我为您创建了一个示例。 我希望它会有用。

ASP.Net页面:

<form id="form1" runat="server">
    <div>
        <div>
            <label>Combobox 1</label>
            <asp:DropDownList runat="server" OnSelectedIndexChanged="Unnamed1_SelectedIndexChanged" AutoPostBack="True">
                <asp:ListItem>Select</asp:ListItem>
                <asp:ListItem>Combo-1-1</asp:ListItem>
                <asp:ListItem>Combo-1-2</asp:ListItem>
            </asp:DropDownList>
        </div>
        <div>
            <label>Combobox 2</label>
            <asp:DropDownList runat="server" OnSelectedIndexChanged="Unnamed1_SelectedIndexChanged" AutoPostBack="True">
                <asp:ListItem>Select</asp:ListItem>
                <asp:ListItem>Combo-2-1</asp:ListItem>
                <asp:ListItem>Combo-2-2</asp:ListItem>
            </asp:DropDownList>
        </div>
        <div>
            <label>Combobox 3</label>
            <asp:DropDownList runat="server" OnSelectedIndexChanged="Unnamed1_SelectedIndexChanged" AutoPostBack="True">
                <asp:ListItem>Select</asp:ListItem>
                <asp:ListItem>Combo-3-1</asp:ListItem>
                <asp:ListItem>Combo-3-2</asp:ListItem>
            </asp:DropDownList>
        </div>
        <div>
            <label>Combobox 4</label>
            <asp:DropDownList runat="server" OnSelectedIndexChanged="Unnamed1_SelectedIndexChanged" AutoPostBack="True">
                <asp:ListItem>Select</asp:ListItem>
                <asp:ListItem>Combo-4-1</asp:ListItem>
                <asp:ListItem>Combo-4-2</asp:ListItem>
            </asp:DropDownList>
        </div>
        <div>
            <label>Combobox 5</label>
            <asp:DropDownList runat="server" OnSelectedIndexChanged="Unnamed1_SelectedIndexChanged" AutoPostBack="True">
                <asp:ListItem>Select</asp:ListItem>
                <asp:ListItem>Combo-5-1</asp:ListItem>
                <asp:ListItem>Combo-5-2</asp:ListItem>
            </asp:DropDownList>
        </div>
        <div>
            <label>Combobox 6</label>
            <asp:DropDownList runat="server" OnSelectedIndexChanged="Unnamed1_SelectedIndexChanged" AutoPostBack="True" Height="19px">
                <asp:ListItem>Select</asp:ListItem>
                <asp:ListItem>Combo-6-1</asp:ListItem>
                <asp:ListItem>Combo-6-2</asp:ListItem>
            </asp:DropDownList>
        </div>
        <div>
            <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
        </div>
    </div>

</form>

ASP.Net代码隐藏

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ViewState["DropdownSelectLimit"] = 0;
        }
    }

    protected void Unnamed1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ViewState["DropdownSelectLimit"] != null)
        {
            if ((int)ViewState["DropdownSelectLimit"] < 2)
            {
                int count = (int)ViewState["DropdownSelectLimit"];
                count++;
                ViewState["DropdownSelectLimit"] = count;
            }
            else
            {
                DropDownList dropDown = (DropDownList)sender;
                dropDown.SelectedIndex = 0;
                Label1.Text = "You can't select any option anymore";
            }
        }
    }

如果您有任何问题,请在评论中问我:)

我为Winforms创建了一个安装程序,因为您是否想要Winforms或ASP.Net尚不清楚

我不会处理您应该如何填充组合框,我敢肯定您知道如何做到这一点,无论是静态填充还是动态填充。

我的解决方案(虽然很粗鲁)使您可以将名为HandleComboBoxSelectedIndexChanged的简化处理程序链接到每个组合框SelectionChanged事件。 这可以是SelectedItemChanged,SelectedValueChanged或SelectedIndexChanged。

非常重要:每个组合都需要一个空值。

//will hold a list of your combobox names
private List<string> SelectedCombos;

//form load: Link the events to the correct handler
private void Form_Load()
{
    foreach(var combo in Controls)
    {
        if(combo is ComboBox)
            combo.SelectedValueChanged += HandleComboBoxSelectedIndexChanged;
    }
}

//will handle the selectedIndexOrItemchanged event
private void HandleComboBoxSelectedIndexChanged(object sender, EventArgs e)
{
    if(SelectedCombos = null)
        SelectedCombos = new List<string>();

    var combo = (ComboBox)sender;
    if(combo.SelectedValue == null)
        if(!SelectedCombos.Exist(combo.Name))
            SelectedCombos.Remove(combo.Name);
    else
        if(!SelectedCombos.Exist(combo.Name) && SelectedCombos.Count < 2)
        SelectedCombos.Add(combo.Name)

    SetComboAvailability();
}

每当选择两个连击时,另一个有用的功能可能会使启用状态为false。 这意味着您的用户只能从2个选定的组合中选择,直到其中一个被重置为空位置为止。 这样,您的用户只能选择可能的方式。

//set the combos availability, less then 2 selections ok, own selection also ok else not ok
private void SetComboAvailability()
{
    foreach(var combo in Controls)
    {
        if(combo is ComboBox)
            combo.Enabled = SelectedCombos.Count < 2 || SelectedCombos.Contains(combo.Name);
    }
}

下面是一个小示例,说明如何根据组合名称检索组合中的所有值。

//Something for handling all the values
private void RetrieveValues()
{
    foreach(var v in SelectedCombos)
    { 
        var combo = this.Controls.Find(v);
        if(combo is ComboBox)
        {           
            //do something with the selectedValue
            var val = combo.SelectedValue; // or selecteditem
            MessageBox.Show(string.Format("Control {0} has value {1}", combo.Name, val);
        }
    }
}

如果您不明白,请随时提出。

也:

EventArgs属性可能会根据所选事件而改变:

请执行:_comboBox1.SelectedValueChanged + =(VS中的TAB TWICE)以查看自动代码生成的外观。 (总是方便)

例:

_comboBox1.SelectedValueChanged += _comboBox1_SelectedValueChanged;

private void _comboBox1_SelectedValueChanged(object sender, EventArgs e){}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM