Wiązanie obiektu do UI a walidacja

0

Tytuł pewnie trochę dziwny, ale po kolei.

Mam klasę

public class User
{
private string email;

    public virtual string Email
    {
        get
        {
            return email;
        }

        set
        {
            string emailPattern = @"^(([^<>()[\]\\.,;:\s@\""]+" + @"(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@" 
                + @"((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" + @"\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+" + @"[a-zA-Z]{2,}))$";
            Regex emailValidator = new Regex(emailPattern);
            if (!emailValidator.IsMatch(value))
                throw new ArgumentException("Email", "Niepoprawny adres email");

            email = value;
        }
    }

}


oraz obiekt tej klasy

<code class="c#">User user = new User();

Teraz mam formę, na której mam TextBoxa tbEmail. Robię dowiązanie do tego edita

tbEmail.DataBindings.Add("Text", user, "Login");


i wsio ok - dane się pokazują, jak zmienię w edicie to są zmiany w obiekcie user. Ale, no właśnie jest jedno ale - walidację mam na poziomie właściwości klasy i chciałbym, aby tak pozostało. I teraz jeśli dla tbEmail.CauseValidation mam na true to jeśli podam błędny email to nie pozwoli mi opuścić edita (nawet okienka się zamknąć nie da :) ) ale nie wyświetla żadnego komunikatu, nie generuje żadnego błędu, nic. Nie potrafię też znaleźć właściwości (metody, zdażenia, cokolwiek) co było by automatycznie wołane jeśli przypisanie czegoś do dowiązanej właściwości się nie uda - głupio to wygląda bo aplikacja ani me ani be tylko cały czas wraca do edita. Natomiast jeśli mam tbEmail.CauseValidation na false to mogę sobie sam walidować dane ale wtedy muszę przepisać kod do sprawdzania poprawności czyli mamy walidację w kilku miejscach co jest brzydkie i może prowadzić do tego, że w różnych miejscach będzie różna walidacja
0

chyba tak ... ale moze mozna prosciej ? (wlasny textbox bazujacy na tym)

     
      Binding b = textBox1.DataBindings.Add("Text", user, "Email", true);//TRUE ! wazny
      b.BindingComplete += user_BindingComplete;
       void user_BindingComplete(object sender, BindingCompleteEventArgs e)
        {
            if (e.BindingCompleteState != BindingCompleteState.Success)
                MessageBox.Show(e.ErrorText);
        }
0

reichel niech Ci Bóg w dzieciach wynagrodzi :) tyle co nagrzebałem w sieci i oczywiście na to nie trafiłem

0

Żeby było bardziej elegancko skorzystaj ze statycznej metody IsMatch -> Regex.IsMatch. Po co bez sensu tworzyć obiekty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1