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

时间:2011-09-16 16:51:01

标签: c# controls try-catch

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

3 个答案:

答案 0 :(得分:1)

清除用户输入,因为它不是给定格式,对用户不友好。如果十个字符中只有一个错了怎么办?他们必须再次打字。只需使用MaskedTextBox Mask作为您期望的模式。

使用MaskedTextBox时,您可以按照here所述订阅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);
}

答案 1 :(得分:0)

抛出预期行为的例外是永远不对的,因为它们非常昂贵。如果您需要查看异常发生的位置,请检查堆栈跟踪的顶行。

答案 2 :(得分:0)

仅调试

您可以从yourForm.cs获取调试模式下的控件名称。我不认为这个代码将运行在relez 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! " );

    }

}