Как отловить имя элемента управления, вызвавшее исключение в C #? - PullRequest
1 голос
/ 16 сентября 2011

У меня есть несколько текстовых полей, которые должны разрешать определенный формат, но когда пользователь вводит его в неправильном формате в текстовое поле, я хотел бы поймать имя элемента управления и очистить текст текстового поля.

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

Очистка пользовательского ввода, потому что он не в заданном формате, очень неудобен для пользователя.Что, если только один из десяти символов был неправильным?Им придется снова и снова печатать.Просто используйте MaskedTextBox с Mask для ожидаемого образца.

При использовании 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);
}
0 голосов
/ 04 сентября 2017

только отладка

вы можете получить имя элемента управления в режиме отладки из yourForm.cs. я не думаю, что этот код будет работать после релиза, потому что. исходный файл не будет выпущен, верно?

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! " );

    }

}
0 голосов
/ 16 сентября 2011

Бросать исключения для ожидаемого поведения никогда не бывает правильно, так как они очень дороги. Если вам нужно увидеть, откуда возникло исключение, просто проверьте верхнюю строку трассировки стека.

...