如何在C#中验证文本框以接受Windows应用程序中的某些格式 [英] How do I validate textbox in C# to accept certain format in windows application

查看:62
本文介绍了如何在C#中验证文本框以接受Windows应用程序中的某些格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试验证文本框以接受某种格式的用户输入

我需要用户输入作为前3位数字作为数字123,然后是年份1950年 - 当前年份,然后是六位数字唯一标识符。



我对这种验证不是很熟悉。



任何建议和帮助都是赞。

解决方案

查看我的解决方案,了解您非常相似的问题。



如何在C#中验证文本框以检查文本框中的某些格式离开事件? [ ^ ]


如果需要,只需验证它。有什么问题?



但更好的想法是不允许用户输入错误的数据,除非规则太混乱。但是,对于时间关联数据,使用某种DateTimePicker会好得多。遗憾的是,您没有告诉我们您正在使用的UI框架/库。它可以是.NET FCL控件,例如 System.Windows.Forms.DateTimePicker ,或某些第三方控件。始终,始终标记您正在使用的UI框架/库。



-SA


< b>更新:

  bool  IsMillennium = ; 
private void textBox1_KeyPress( object sender,KeyPressEventArgs e)
{
string CurrentYear = DateTime.Now.Year.ToString();

if (e.KeyChar == 8
{
e.Handled = false ; // 接受BackSpace
return ;
}

if (!char.IsNumber(e.KeyChar))
{
e。 Handled = true ; // 拒绝任何按键但数字
返回;
}

if (textBox1.TextLength > = < span class =code-digit> 4
// 了解千禧wuser进入
{
if (textBox1.Text [ 3 ] == ' 1' // [1] 950
{
IsMillennium = false ; // 这意味着我们在1950~1999
}
else if (textBox1.Text [ 3 ] == CurrentYear [ 0 ]) // b部分
{
IsMillennium = true ; // 这意味着我们在2000年到当年(AKA 2015)
}
}

if (textBox1.TextLength < 13 // 确保我们的文字限制
{
if (textBox1.TextLength < 3 // 前3个字符我们只接受数字
{
if char .IsNumber(e.KeyChar))
{
e.Handled = false ;
}
其他
{
e.Handled = true ;
}
}
else
{
// 如果文本lenght = 3这意味着我们输入年份部分valdiation
// year valdiation有4个partsto valdiate
// [1] [9] [5] [0]直到CurrentYear [0] [1] [2] [3]变量

if (textBox1.TextLength == 3
{
// 年份第1部分
// 需要接受1950年至今年之间的日期
// 所以我们检查第一年char为1 [1] 950和CurrentYear [0],这是我们的第一个字符变量
// 所以它必须介于1和CurrentYear [0]之间,这就是我们转换的原因它到Int
var yearchar1 = int .Parse(e.KeyChar。的ToString());
// if((yearchar1 == 1 || yearchar1< = int.Parse(CurrentYear [0 ] .ToString()))&& yearchar1!= 0)
if (yearchar1 < = int .Parse(CurrentYear [ 0 ]。ToString())& ;& yearchar1!= 0
{
e.Handled = false ;
}
其他
{
e.Handled = true ;
}
}
其他 如果(textBox1.TextLength == 4
{
// 年第2部分
// 这部分很棘手我们无法比较它9和0 casue这将给我们所有数字范围0~9,我们不需要
// 但我们需要将其分为两部分
// A部分:如果最后一个字符是1那么我们需要9来跟随它:1 [9] 50
// B部分:如果是最后一个字符是CurrentYear [0]然后我们的关键需要小于或等于CurrentYear [1]

var yearchar2 = < span class =code-keyword> int
.Parse(e.KeyChar.ToString());
if (textBox1.Text [ 3 ] == ' 1' // A部分
{
如果(yearchar2 == 9
{
e.Handled = false ;
}
其他
{
e.Handled = true ;
}
}
else if (textBox1.Text [< span class =code-digit> 3
] == CurrentYear [ 0 ]) // B部分
{
如果(yearchar2 < = int .Parse(CurrentYear [ 1 ]。ToString( ))) // key必须小于或等于CurrentYear [1]
{
e.Handled = false ;
}
其他
{
e.Handled = true ;
}
}
}
其他 如果( textBox1.TextLength == 5
{
// 年第3部分
// 就像我们需要知道的最后一部分我们要在哪里进行验证。
// 谢天谢地我们得到了变量IsMillennium我们之前设置了
// 我们只能在有4或之后使用它我们的文本框中有更多字符,否则它的值将是错误的
// IsMillennium = false表示我们验证19 [5] 0~19 [9] 9
// IsMillennium = true表示我们验证20 [0] 0~CurrentYear AKA 20 [1] 5
// C部分:betwwen 5和9
// D部分:小于或等于CurrentYear的密钥[2]
var yearchar3 = INT .Parse(e.KeyChar.ToString());
if (!IsMillennium)
{
if (yearchar3 < span class =code-keyword>>
= 5 && yearchar3 < = 9 // C部分
{
e.Handled = false ;
}
其他
{
e.Handled = true ;
}
}
else
{
if (yearchar3 < = int .Parse(CurrentYear [ 2 ]。ToString())) // D部分
{
e.Handled = false ;
}
其他
{
e.Handled = true ;
}
}

}
其他 如果(textBox1.TextLength == 6
{
// 年份第4部分
// 和其他我们一样将问题分解为较小的问题,以便解决问题更容易
// E部分:如果IsMillennium = false然后它必须在0到9之间==== 195 [0]
// F部分:如果IsMillennium = true则必须小于或等于CurrentYear [3] ==== 201 [5]
// 此处的另一个诀窍Millennium将包含2个或更多部分
// 2000~2009的第1部分和2010年至今的第2部分
// 第一部分:我们可以通过检查textBox1.Text [5]< int.Parse(CurrentYear [2] .ToString())然后我们接受所有数字范围
// 第二部分:但如果它等于我们当前的那么我们接受
var yearchar4 = INT .Parse(e.KeyChar.ToString());
if (!IsMillennium)
{
if (yearchar4 < span class =code-keyword>>
= 0 && yearchar4 < = 9 // E部分
{
e.Handled = false ;
}
其他
{
e.Handled = true ;
}
}
其他
{ // F部分
if int .Parse(textBox1.Text [ 5 ]。ToString())< int .Parse(CurrentYear [ 2 ]。ToString())) // 第一部分
{
e.Handled = false ;
}
else
{
if (yearchar4 < = int .Parse(CurrentYear [ 3 ]。ToString())) // 第二部分
{
e.Handled = false ;
}
其他
{
e.Handled = true ;
}
}

}

}
其他 if (textBox1.TextLength > 6
{
// 待办事项:六位数唯一标识符。
< span class =code-keyword> if
char .IsNumber(e.KeyChar))
{
e.Handled = false ;
}
其他
{
e.Handled = true ;
}
}
}
}
其他
{
// 在达到最大有效长度后拒绝任何按键
e.Handled = ;
}
}





编辑:

好吧,如果您在按键上进行了验证,那么为什么您需要在休假时进行验证,您已经很难键入键和按键事件只接受特定键。

如果文本有,您可以在休假时验证在你的情况下是否正确长度

  private   void  textBox1_Leave( object  sender,EventArgs e)
{
if (textBox1.TextLength!= 10
{
textBox1.Focus();
}
}



请注意,这会让用户变得如此困难,因为它会阻止他离开文本框,直到他输入正确的格式


I am trying to validate a textbox to accept user input in certain format
I need user input as first 3 digits as number 123 followed by year ranging 1950-current year and followed by six digit unique identifier.

I am not much familiar with this kind of validations.

Any suggestions and help is appreciated.

解决方案

See my Solution for your very similar question.

How do I validate textbox in C# to check certain format in textbox at leave event?[^]


Just validate it, if you need. What's the problem?

But better idea is just not to allow the user to enter wrong data, unless the rules are too confusing. For the time-relate data, however, it would be much better to use some kind of "DateTimePicker". Unfortunately you did not inform us what UI framework/library you are using. It can be a .NET FCL control, such as System.Windows.Forms.DateTimePicker, or some 3rd-party control. Always, always tag the UI framework/library you are using.

—SA


Updated:

bool IsMillennium = false;
 private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            string CurrentYear = DateTime.Now.Year.ToString();

            if (e.KeyChar == 8)
            {
                e.Handled = false;  // Accept BackSpace
                return;
            }

            if (!char.IsNumber(e.KeyChar))
            {
                e.Handled = true;  // reject any key press but numbers
                return;
            }

            if (textBox1.TextLength >= 4)  // to know which Millennium wuser enters
            {
                if (textBox1.Text[3] == '1')  // [1]950
                {
                    IsMillennium = false; // this mean we at 1950 ~ 1999
                }
                else if (textBox1.Text[3] == CurrentYear[0]) //Part b
                {
                    IsMillennium = true;   //this mean we at 2000 till current year (AKA 2015)
                }
            }

            if (textBox1.TextLength < 13)   // Make sure we at our text limits
            {
                if (textBox1.TextLength < 3) // for first 3 chars we accept Number only
                {
                    if (char.IsNumber(e.KeyChar))
                    {
                        e.Handled = false;
                    }
                    else
                    {
                        e.Handled = true;
                    }
                }
                else
                {
                    // if the text lenght=3 this mean we enter the year part valdiation
                    // year valdiation have 4 partsto valdiate
                    // [1][9][5][0] till CurrentYear[0][1][2][3] variable

                    if (textBox1.TextLength == 3)
                    {
                        //year Part 1
                        // need to accept date between 1950 ~ Current Year
                        //so we check first year char either 1 for [1]950 and  CurrentYear[0] which is first char in our variable
                        // so it must be between 1 and CurrentYear[0] that's why we convert it to Int
                        var yearchar1 = int.Parse(e.KeyChar.ToString());
                        //if ((yearchar1 == 1 || yearchar1 <= int.Parse(CurrentYear[0].ToString())) && yearchar1 != 0)
                        if (yearchar1 <= int.Parse(CurrentYear[0].ToString()) && yearchar1 != 0)
                        {
                            e.Handled = false;
                        }
                        else
                        {
                            e.Handled = true;
                        }
                    }
                    else if (textBox1.TextLength == 4)
                    {
                        //year Part 2
                        //this part is tricky we can't compare it betwwen 9 and 0 casue this will give us all numbers range 0~9 and that's we don't need 
                        //but wee need to break it into 2 parts
                        //Part A: if last char was 1 then we need 9 to follow it for :"1[9]50"
                        //Part B: if last char was CurrentYear[0] then our key need to be smaller than or equal of CurrentYear[1]

                        var yearchar2 = int.Parse(e.KeyChar.ToString());
                        if (textBox1.Text[3] == '1')  // Part A
                        {
                            if (yearchar2 == 9)
                            {
                                e.Handled = false;
                            }
                            else
                            {
                                e.Handled = true;
                            }
                        }
                        else if (textBox1.Text[3] == CurrentYear[0]) //Part B
                        {
                            if (yearchar2 <= int.Parse(CurrentYear[1].ToString()))  //key need to be smaller than or equal of CurrentYear[1]
                            {
                                e.Handled = false;
                            }
                            else
                            {
                                e.Handled = true;
                            }
                        }
                    }
                    else if (textBox1.TextLength == 5)
                    {
                        //year Part 3
                        //like last part we need to know where we are to do our validation right.
                        // thankfully we got our variable IsMillennium which we set it earlier
                        // and we can use it only after  when there is 4 or more chars in our textbox otherwise it's value will be wrong
                        //IsMillennium = false mean we validate 19[5]0 ~ 19[9]9
                        //IsMillennium = true mean we validate 20[0]0 ~ CurrentYear AKA 20[1]5
                        // Part C: betwwen 5 and 9
                        // Part D: key smaller than or equal CurrentYear[2]
                        var yearchar3 = int.Parse(e.KeyChar.ToString());
                        if (!IsMillennium)
                        {
                            if (yearchar3 >= 5 && yearchar3 <= 9) // Part C
                            {
                                e.Handled = false;
                            }
                            else
                            {
                                e.Handled = true;
                            }
                        }
                        else
                        {
                            if (yearchar3 <= int.Parse(CurrentYear[2].ToString()))  // part D
                            {
                                e.Handled = false;
                            }
                            else
                            {
                                e.Handled = true;
                            }
                        }

                    }
                    else if (textBox1.TextLength == 6)
                    {
                        // year part 4
                        // like other we break our problem to smaller problems so it be easyer to solve
                        // Part E: If IsMillennium = false then it must between 0 and 9   ==== 195[0]
                        // Part F: If IsMillennium = true then it must be smaller than or equal CurrentYear[3] ==== 201[5]
                        // another Trick here Millennium will consist of 2 or more parts
                        // 1st part for 2000~2009  and 2nd part for 2010 to current year
                        // Part I: we can break this more to be valide for ever by check if textBox1.Text[5] <  int.Parse(CurrentYear[2].ToString()) then we accept all number ranges
                        // Part II: but if it equal to our current then we accept
                        var yearchar4 = int.Parse(e.KeyChar.ToString());
                        if (!IsMillennium)
                        {
                            if (yearchar4 >= 0 && yearchar4 <= 9) // Part E
                            {
                                e.Handled = false;
                            }
                            else
                            {
                                e.Handled = true;
                            }
                        }
                        else
                        {    // Part F
                            if (int.Parse(textBox1.Text[5].ToString()) < int.Parse(CurrentYear[2].ToString()))// Part I
                            {
                                e.Handled = false;
                            }
                            else
                            {
                                if (yearchar4 <= int.Parse(CurrentYear[3].ToString()))  // Part II
                                {
                                    e.Handled = false;
                                }
                                else
                                {
                                    e.Handled = true;
                                }
                            }

                        }

                    }
                    else if (textBox1.TextLength > 6)
                    {
                        //TO DO : Six digit unique identifier.
                        if (char.IsNumber(e.KeyChar))
                        {
                            e.Handled = false;
                        }
                        else
                        {
                            e.Handled = true;
                        }
                    }
                }
            }
            else
            {
                // reject any key press after it reach max valid lenght
                e.Handled = true;
            }
        }



Edit :
well, if you done validation on key press then why you need validation on leave you already made it hard to type keys and key press event accept specific keys only.
you can validate on leave if the text have the correct length or not in your case something like that

private void textBox1_Leave(object sender, EventArgs e)
        {
            if(textBox1.TextLength != 10)
            {
                textBox1.Focus();
            }
        }


Please Notice that will make it so hard to user because it will prevent him from leave the textbox until he enter the correct format.


这篇关于如何在C#中验证文本框以接受Windows应用程序中的某些格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆