有4个combobox,数据源相同,用户需要做到互斥。比如box1选了"0",那其余3个就无法选"0",但是如果box1选了""空字符串,"0"就自动恢复到box1。也就是说,combobox需要记住删除了哪几个元素,待需要的时候还原。
如下图,box1 = 0, box2 = 1, box3= 2,那么box4就无法选择0,1,2。但是如果将box1,box2,box3值设为""空字符串,那么box4就可以显示所有的数字。
请问各位有何高招来解决4个combobox兄弟引起的血案呢?
附源代码:
Code
public partial class Form1 : Form
{
//数据源上万,我项目中数据源为4万条。这里模拟为1万个数字
private const int TotalLength = 10000;
private List<string> datasource;
public Form1()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//Init
SetComboBox(comboBox1);
SetComboBox(comboBox2);
SetComboBox(comboBox3);
SetComboBox(comboBox4);
}
private void SetDataSource()
{
datasource = new List<string>(TotalLength);
//最开始的是空,表示为用户不选,即其他3个可以有1-9数字;否则就需要去掉已经显示的数字。
datasource.Add(string.Empty);
//加入TotalLenth-1个数字。
for (int i = 0; i < TotalLength - 1; i++)
{
datasource.Add(i.ToString());
}
}
private string[] GetDataSource()
{
string[] temp = new string[TotalLength];
//If datasource = null
if (datasource == null)
SetDataSource();
datasource.CopyTo(temp, 0);
return temp;
}
private void SetComboBox(ComboBox box)
{ box.Items.AddRange(GetDataSource()); }
private void DoWork(ComboBox box, params string[] texts)
{
foreach (string s in texts)
{ HelpMe(box, s); }
}
//在这里做线性表的插入删除。
private void HelpMe(ComboBox box, string text)
{
//为数字,非空,做减法
if (!string.IsNullOrEmpty(text))
{
int index = box.FindString(text);
if (index > 0)
box.Items.RemoveAt(index);
}
else
{ }//为空,这时插入刚才删除的数字。
}
//获取焦点的时候进行判断,并读取其他3个box的text,并进行相应的去除。
//如果其他3个box有空字符,那么表示要将去除的数字恢复到该box中。
//比如box2 = 1, box3 = 2, box4为空,那么box1显示的是空字符+除去1,2的数字。
private void comboBox1_Enter(object sender, EventArgs e)
{ DoWork(sender as ComboBox, comboBox2.Text, comboBox3.Text, comboBox4.Text); }
private void comboBox2_Enter(object sender, EventArgs e)
{ DoWork(sender as ComboBox, comboBox1.Text, comboBox3.Text, comboBox4.Text); }
private void comboBox3_Enter(object sender, EventArgs e)
{ DoWork(sender as ComboBox, comboBox1.Text, comboBox2.Text, comboBox4.Text); }
private void comboBox4_Enter(object sender, EventArgs e)
{ DoWork(sender as ComboBox, comboBox1.Text, comboBox2.Text, comboBox3.Text); }