繁体   English   中英

如何捕获在C#中导致异常的控件名称?

[英]How to catch the control name that caused exception in C#?

我有几个文本框应允许使用某种格式,但是当用户在文本框中以错误的格式输入它时,我想捕获控件名称并清除文本框的文本。

清除用户输入(因为它不是给定格式)非常不友好。 如果十个字符中只有一个是错误的怎么办? 他们必须重新输入一次。 只需将MaskedTextBoxMask配合使用即可。

当使用MaskedTextBox ,您可以订阅MaskInputRejected所描述的事件在这里

public void Form1_Load(Object sender, EventArgs e) 
{
    ... // Other initialization code
    maskedTextBox1.Mask = "00/00/0000";
    maskedTextBox1.MaskInputRejected += new MaskInputRejectedEventHandler(maskedTextBox1_MaskInputRejected)
}

void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
{
    toolTip1.ToolTipTitle = "Invalid Input";
    toolTip1.Show("We're sorry, but only digits (0-9) are allowed in dates.", maskedTextBox1, maskedTextBox1.Location, 5000);
}

仅调试

您可以从yourForm.cs以调试模式获取控件名称。 我不认为此代码将在relese cuz上运行。 源文件不会在该版本中吗?

using System.Diagnostics;

public void ParseControlText()
{
    try
    {
        var doubleval = Double.Parse(tb_double.Text);
        var intval    = Int32.Parse(tb_int.Text);

        //... bunch of controls need to be parssed to calculate  something

    }
    catch (FormatException ex)
    {
        var stlast = new StackTrace(ex,true).GetFrames().Last();

       //this requires   form.cs to exist . how am i gonna do this in release? idk
        var stLine = File.ReadLines(stlast.GetFileName())
            .ToList()[stlast.GetFileLineNumber()-1];
        var m = Regex.Match(stLine ,@"\((.*?)\..*?\)"); 
        var ctrlname = m.Groups[1].Value;

        MessageBox.Show( ctrlname + " control's text coundnt be Parsed! " );

    }

}

抛出异常的预期行为永远是不正确的,因为它们非常昂贵。 如果您需要查看异常的起源,只需检查堆栈跟踪的第一行即可。

暂无
暂无

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

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