多个combox,选中的选项其他combox中不显示与改变选项时恢复选项的问题

时间:2021-02-12 17:16:02
有两个combox1和combox2,选项都是1、2、3、4。
想实现的功能是:
combox1中选1时,点combox2,combox2中没有1这个可选项,有可选项2、3、4。

combox2选一个值4,再点combox1,此时combox1中可选项没4了,有可选项1、2、3,把combox1的选中项改成3后,然后点combox2,combox2中可选项没有3,有可选项1、2、4。

就是combox中可选项的移除和恢复的问题,哎,想了多久了,搞不懂。

在校大学生一枚,各位前辈不要太不屑啊...谢谢啦

7 个解决方案

#1


combox是接受数组录入的,你搞两个数组,数组里输入1,2,3,4,然后当选择某一个combox的值时,判断选得是那个,然后把另外一个combox的数据源数组,剔除掉选中的数字,在录入一遍,就是这时候另外一个combox数据源数组里只有3个值,而不是4个,不懂再问

#2


引用 1 楼 yxyclzx 的回复:
combox是接受数组录入的,你搞两个数组,数组里输入1,2,3,4,然后当选择某一个combox的值时,判断选得是那个,然后把另外一个combox的数据源数组,剔除掉选中的数字,在录入一遍,就是这时候另外一个combox数据源数组里只有3个值,而不是4个,不懂再问


那再次改变选项时,恢复移除的选项呢?

#3


写了个示例 看看吧 你说的移除项再恢复恐怕实现起来挺困难的 看看我的方法
窗体上加两个ComboBox我就不说啦 直接上代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace My
{
    public partial class Form2 : Form
    {
        //初始化固定选项
        object[] obj = { 1, 2, 3, 4 };

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            //初始化两个ComboBox
            comboBox1.Items.AddRange(obj);
            comboBox1.SelectedIndex = 0;
            comboBox2.Items.AddRange(obj);
            comboBox2.SelectedIndex = 0;
        }

        /// <summary>
        /// 当组合框的下拉部分关闭时触发此事件
        /// </summary>
        /// <param name="sender">事件源</param>
        /// <param name="e"></param>
        private void comboBox1_DropDownClosed(object sender, EventArgs e)
        {
            //清空候选的那个ComboBox2
            comboBox2.Items.Clear();

            //最好是不要写在SelectedIndexChanged事件里 因为在界面初始化的时候会执行一次


            //如果不设置默认选中项的话没问题(但是不设置用户会感觉很怪 怎么没有选项)
            //设置了的话到时候结果就不是你想要的了 很恶心的


            //遍历固定集合 因为始终是和这四个数做比较
            //你可以在脑子里模拟一下流程 最好是在纸上画下来 就会理解的
            foreach (object item in obj)
            {
                //将不是当前选中项的值添加到候选的ComboBox里
                if (comboBox1.SelectedItem != item)
                {
                    comboBox2.Items.Add(item);
                    //始终选中第一位 利于观察变化
                    comboBox2.SelectedIndex = 0;
                }
            }
        }

        /// <summary>
        /// 当组合框的下拉部分关闭时触发 详细注释请往上看
        /// </summary>
        /// <param name="sender">事件源</param>
        /// <param name="e"></param>
        private void comboBox2_DropDownClosed(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();
            foreach (object itm in obj)
            {
                if (comboBox2.SelectedItem != itm)
                {
                    comboBox1.Items.Add(itm);
                    comboBox1.SelectedIndex = 0;
                }
            }
        }

    }
}


顺便画了张图 方便理解 看不清的话   点我
多个combox,选中的选项其他combox中不显示与改变选项时恢复选项的问题

#4


引用 3 楼 ducker3590 的回复:
写了个示例 看看吧 你说的移除项再恢复恐怕实现起来挺困难的 看看我的方法
窗体上加两个ComboBox我就不说啦 直接上代码


C# code?



1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162……


移除我能实现,但是就是不能恢复。
朋友,您的代码每次都会重置其他combobox的值的哇...

#5


引用 4 楼 dh2258628 的回复:
引用 3 楼 ducker3590 的回复:写了个示例 看看吧 你说的移除项再恢复恐怕实现起来挺困难的 看看我的方法
窗体上加两个ComboBox我就不说啦 直接上代码


C# code?



12345678910111213141516171819202122232425262728293031323334353637383940414243444……

重置有什么关系么? 达到你想要的效果了啊
你移除之后你的ComboBox里面的选项就改变了 再去比较的话就不对了 无论换哪边选择 你始终是要和1,2,3,4去比较的

#6


引用 4 楼 dh2258628 的回复:
移除我能实现,但是就是不能恢复。
 朋友,您的代码每次都会重置其他combobox的值的哇... 

重置就重新从数据库读取一遍
觉得你这需求用combobox还不如用textbox+click事件

#7


引用 5 楼 ducker3590 的回复:
引用 4 楼 dh2258628 的回复:
引用 3 楼 ducker3590 的回复:写了个示例 看看吧 你说的移除项再恢复恐怕实现起来挺困难的 看看我的方法
窗体上加两个ComboBox我就不说啦 直接上代码


C# code?



1234567891011121314151617181920212223242526272829303132333435363738394……


之前的combobox选中的项会被清除的,那之前选中一个项不是等于白选了吗?

#1


combox是接受数组录入的,你搞两个数组,数组里输入1,2,3,4,然后当选择某一个combox的值时,判断选得是那个,然后把另外一个combox的数据源数组,剔除掉选中的数字,在录入一遍,就是这时候另外一个combox数据源数组里只有3个值,而不是4个,不懂再问

#2


引用 1 楼 yxyclzx 的回复:
combox是接受数组录入的,你搞两个数组,数组里输入1,2,3,4,然后当选择某一个combox的值时,判断选得是那个,然后把另外一个combox的数据源数组,剔除掉选中的数字,在录入一遍,就是这时候另外一个combox数据源数组里只有3个值,而不是4个,不懂再问


那再次改变选项时,恢复移除的选项呢?

#3


写了个示例 看看吧 你说的移除项再恢复恐怕实现起来挺困难的 看看我的方法
窗体上加两个ComboBox我就不说啦 直接上代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace My
{
    public partial class Form2 : Form
    {
        //初始化固定选项
        object[] obj = { 1, 2, 3, 4 };

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            //初始化两个ComboBox
            comboBox1.Items.AddRange(obj);
            comboBox1.SelectedIndex = 0;
            comboBox2.Items.AddRange(obj);
            comboBox2.SelectedIndex = 0;
        }

        /// <summary>
        /// 当组合框的下拉部分关闭时触发此事件
        /// </summary>
        /// <param name="sender">事件源</param>
        /// <param name="e"></param>
        private void comboBox1_DropDownClosed(object sender, EventArgs e)
        {
            //清空候选的那个ComboBox2
            comboBox2.Items.Clear();

            //最好是不要写在SelectedIndexChanged事件里 因为在界面初始化的时候会执行一次


            //如果不设置默认选中项的话没问题(但是不设置用户会感觉很怪 怎么没有选项)
            //设置了的话到时候结果就不是你想要的了 很恶心的


            //遍历固定集合 因为始终是和这四个数做比较
            //你可以在脑子里模拟一下流程 最好是在纸上画下来 就会理解的
            foreach (object item in obj)
            {
                //将不是当前选中项的值添加到候选的ComboBox里
                if (comboBox1.SelectedItem != item)
                {
                    comboBox2.Items.Add(item);
                    //始终选中第一位 利于观察变化
                    comboBox2.SelectedIndex = 0;
                }
            }
        }

        /// <summary>
        /// 当组合框的下拉部分关闭时触发 详细注释请往上看
        /// </summary>
        /// <param name="sender">事件源</param>
        /// <param name="e"></param>
        private void comboBox2_DropDownClosed(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();
            foreach (object itm in obj)
            {
                if (comboBox2.SelectedItem != itm)
                {
                    comboBox1.Items.Add(itm);
                    comboBox1.SelectedIndex = 0;
                }
            }
        }

    }
}


顺便画了张图 方便理解 看不清的话   点我
多个combox,选中的选项其他combox中不显示与改变选项时恢复选项的问题

#4


引用 3 楼 ducker3590 的回复:
写了个示例 看看吧 你说的移除项再恢复恐怕实现起来挺困难的 看看我的方法
窗体上加两个ComboBox我就不说啦 直接上代码


C# code?



1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162……


移除我能实现,但是就是不能恢复。
朋友,您的代码每次都会重置其他combobox的值的哇...

#5


引用 4 楼 dh2258628 的回复:
引用 3 楼 ducker3590 的回复:写了个示例 看看吧 你说的移除项再恢复恐怕实现起来挺困难的 看看我的方法
窗体上加两个ComboBox我就不说啦 直接上代码


C# code?



12345678910111213141516171819202122232425262728293031323334353637383940414243444……

重置有什么关系么? 达到你想要的效果了啊
你移除之后你的ComboBox里面的选项就改变了 再去比较的话就不对了 无论换哪边选择 你始终是要和1,2,3,4去比较的

#6


引用 4 楼 dh2258628 的回复:
移除我能实现,但是就是不能恢复。
 朋友,您的代码每次都会重置其他combobox的值的哇... 

重置就重新从数据库读取一遍
觉得你这需求用combobox还不如用textbox+click事件

#7


引用 5 楼 ducker3590 的回复:
引用 4 楼 dh2258628 的回复:
引用 3 楼 ducker3590 的回复:写了个示例 看看吧 你说的移除项再恢复恐怕实现起来挺困难的 看看我的方法
窗体上加两个ComboBox我就不说啦 直接上代码


C# code?



1234567891011121314151617181920212223242526272829303132333435363738394……


之前的combobox选中的项会被清除的,那之前选中一个项不是等于白选了吗?