C# winfrom 怎么判断多个文本框中的值是否存在相同

判断是否有值才进行对比哦,默认为空的...

用一个List<string>存放文本框中的内容,遍历父控件中所有子控件,如果子控件为文本框,先检查文本框值是否存在于list中,如果存为则说明有重复,如果没有,则把值添加到list中,如果最终没有出现重复值,说明不存在相同的。见下如代码:

        private void button1_Click(object sender, EventArgs e)
        {
            List<string> strlst = new List<string>();
            bool has = false;
            foreach (Control ctl in this.Controls)
            {
                if (ctl is TextBox)
                {
                    if (strlst.Contains(ctl.Text))
                    {
                        MessageBox.Show("存在重复");
                        has = true;
                        break;
                    }
                    else
                    {
                        strlst.Add(ctl.Text);
                    }
                }
            }
            if (!has)
            {
                MessageBox.Show("不存在重复");
            }
        }
    }

效果如图:

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-29
好吧。。我来说说我想到的最简单的吧
Dictionary<string, string> dic = new Dictionary<string, string>();
try
{
dic.add(textbox1.text,"1");//"1"不用管,其实随便写什么只要是个字符串就行
dic.add(textbox2.text,"1");
dic.add(textbox3.text,"1");
dic.add(textbox4.text,"1");
dic.add(textbox5.text,"1");
dic.add(textbox6.text,"1");
dic.add(textbox7.text,"1");
}
catch
{
return;
如果进入catch,就等于出现异常,也就是说文本框中的值有重复
具体原理不懂可以去看看Dictionary字典的说明,Dictionary字典的键是不允许重复的
}
没进入catch就是文本框的值没重复,进行你需要的操作,在CATCH{}外面写你想写的代码即可追问

如果后面有些文本框为空呢?用户只填两个怎么办?

追答

用户只填写两个会进入catch,因为有多个空,值就重复,如果你希望用户填两个,其他不填不会报错的话,代码可以这么改:把所有ADD都改成textbox1的形式,那么就能达到你说的目的了
Dictionary dic = new Dictionary();
try
{
dic.add(textbox1.text.trim()==""?textbox1.id.tostring():textbox1.text.trim(),"1");//"1"不用管,其实随便写什么只要是个字符串就行
dic.add(textbox2.text,"1");
dic.add(textbox3.text,"1");
dic.add(textbox4.text,"1");
dic.add(textbox5.text,"1");
dic.add(textbox6.text,"1");
dic.add(textbox7.text,"1");
}
catch
{
return;
如果进入catch,就等于出现异常,也就是说文本框中的值有重复
具体原理不懂可以去看看Dictionary字典的说明,Dictionary字典的键是不允许重复的
}

追问

貌似你的有点小错误捏..找不到textbox1.id.tostring():这个属性耶..

追答

先小汗一下,首先,请确认你的TextBox控件是服务器控件,其次请确定自己的代码有没写错,textbox1.id.tostring():中textbox1指的是控件的ID,id(其实在后台的写法是大写ID)指的是控件的ID属性,这个值是必然存在的。

第2个回答  2011-12-29
List<TextBox> list = new List<TextBox>();
//查找页面上所有控件
foreach (Control item in this.Controls)
{
if (item is TextBox)//判断是否是一个TB
{
list.Add(item as TextBox);//转换为TB放入集合
}
}
foreach (var item1 in list)
{
foreach (var item2 in list)
{
if (item1.Text != string.Empty && item2.Text != string.Empty && item1.Text == item2.Text)//判断值
{
//放入你的操作
list.Remove(item2);//避免后面重复循环
}
}
list.Remove(item1);//避免后面重复循环
}
第3个回答  2011-12-29
用遍历窗体控件集合的方法比较好,如果遍历到的控件是textbox类型,传第一个值保存在数组中,第二个值和数组中前一个值比较,相同则不保存,不相同则保存,最后看看数组中数量和控件的数量一致不,不一致说明有一样的值
第4个回答  2011-12-29
我想了两种思路,winform没有findControl,只有个this.Controls.Contains("textBox1"),因此除了遍历没办法了。。。
思路1:遍历Controls,具体你自己完善下,
if(this.Controls.Count>0)
{
foreach(Control c in this.Controls)
if(c.GetTepy==Tepyof(TextBox))
string str += ((TextBox)c).Text;
}
思路2,把你所有的TextBox从TextBox1到TextBoxN全部保存在一个数组中,虽然比较麻烦,但是实现相对比较简单些,如下
TextBox[ ] tb = new TextBox[10]{textBox1,……textBox10};
再用tb[i].Text 访问textBox的内容。追问

判断是否有值才进行对比哦,默认为空的...还有就是怎么满足条件后怎么跳出两个for循环啊?我用的跟你的第二个方法一样吧

追答

{
//for (int i = 1; i <= 30; i++)
//{
// Control tb = this.Controls.Contains("textBox1");

//}
TextBox[ ] tb = new TextBox[3]{textBox1,textBox2,textBox3};
//for (int i = 0; i < tb.Length; i++)
//{
// if (tb[i].Text != "")
// {
// string str = "text";
// str.Equals()
// }
//}

for (int i = 0; i < tb.Length; i++)
{
if (tb[i].Text != "")
{
for(int j=0;j<i;j++)
{
if(tb[i].Text==tb[j].Text)
{
MessageBox.Show("第" + i + "个和第" + j + "个相同!");
}
}
}
}

不管是第一种思路还是第二种,都必须判断数组中的值。这就跟99乘法表一样,必须用2个for循环,没办法的,呵呵

追问

关键是相同了,怎么跳出两个for循环啊

追答

判断数组内的值只能用2个for或者foreach,除非数组内只有2个值。你也知道,在编程中数组是个神奇的东西,我们经常用的datatable和dataset以及view、list泛型都是用的多维数组,必须进行二次匹配的哈,如果不用datatabla,我们用多维数组照样可以取到数据中的值,程序都是万变不离其宗,只不过我俩用数组保存textbox的方法比较笨而已,呵呵,程序能达到预想的效果就不错了。末楼:alex901226 那位兄弟用list泛型相对比较正规吧,把窗体的控件全部遍历个遍虽然很省事,如果窗体其中有一个textbox的用处不在要判断的控件之列就不好了,你不妨试试,其实两种方式,思路都是一个样,都是遍历数组的值进行判断。我个人比较喜欢简单,所以只能用数组了。。

本回答被提问者采纳
相似回答