Created
February 2, 2016 21:23
-
-
Save cwensley/8348615c67618dc46102 to your computer and use it in GitHub Desktop.
Example of how to validate the input of controls on an Eto.Forms dialog.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using Eto.Forms; | |
using Eto.Drawing; | |
namespace MyValidationApp | |
{ | |
// base validator that can be extended to do custom validation | |
public class ControlValidator | |
{ | |
public Control Target { get; private set; } | |
public string Message { get; set; } | |
readonly Func<bool> validate; | |
public ControlValidator (Control target, Func<bool> validate, string message = null) | |
{ | |
Target = target; | |
this.validate = validate; | |
Message = message; | |
} | |
protected virtual void SetValid() | |
{ | |
Target.BackgroundColor = SystemColors.ControlBackground; | |
} | |
protected virtual void SetInvalid() | |
{ | |
Target.BackgroundColor = Colors.Red; | |
} | |
public bool Validate() | |
{ | |
if (validate()) | |
{ | |
SetValid (); | |
return true; | |
} | |
SetInvalid (); | |
return false; | |
} | |
} | |
// collection of validations | |
class ValidationHandler : List<ControlValidator> | |
{ | |
public Action<IEnumerable<ControlValidator>> IsInvalid { get; set; } | |
public IEnumerable<ControlValidator> Validate() | |
{ | |
var invalidItems = new List<ControlValidator>(); | |
foreach (var item in this) { | |
if (!item.Validate ()) | |
invalidItems.Add (item); | |
} | |
if (invalidItems.Count > 0 && IsInvalid != null) | |
IsInvalid (invalidItems); | |
return invalidItems; | |
} | |
} | |
// dialog that uses control validation | |
public class MyValidationDialog : Dialog<bool> | |
{ | |
public MyValidationDialog () | |
{ | |
var validations = new ValidationHandler(); | |
validations.IsInvalid = items => { | |
// focus the first item with an error | |
items.First().Target.Focus(); | |
// show error | |
var message = string.Join("\n", items.Where(r => r.Message != null).Select(r => " > " + r.Message)); | |
if (!string.IsNullOrEmpty(message)) | |
MessageBox.Show("Errors in the form:\n" + message, null, MessageBoxButtons.OK, MessageBoxType.Error); | |
}; | |
// input controls | |
var myTextBox = new TextBox (); | |
var myDropDown = new DropDown { Items = { "Male", "Female" } }; | |
// validations | |
validations.Add (new ControlValidator (myTextBox, () => !string.IsNullOrEmpty(myTextBox.Text), "Name is required")); | |
validations.Add (new ControlValidator (myDropDown, () => myDropDown.SelectedValue != null, "Gender is required")); | |
// buttons | |
var btnOk = new Button { Text = "Ok" }; | |
btnOk.Click += (sender, e) => { | |
if (!validations.Validate().Any()) | |
Close (true); | |
}; | |
var btnCancel = new Button { Text = "Cancel" }; | |
btnCancel.Click += (sender, e) => Close(false); | |
// content | |
Content = new StackLayout { | |
HorizontalContentAlignment = HorizontalAlignment.Stretch, | |
Spacing = 10, | |
Items = { | |
new StackLayoutItem(new TableLayout { | |
Padding = 10, | |
Spacing = new Size(5, 5), | |
Rows = { | |
new TableRow("Name", myTextBox), | |
new TableRow("Gender", myDropDown) | |
} | |
}, expand: true), | |
new StackLayout { | |
Orientation = Orientation.Horizontal, | |
Spacing = 5, | |
Items = { null, btnOk, btnCancel } | |
} | |
} | |
}; | |
Title = "My Dialog with Validation"; | |
DefaultButton = btnOk; | |
AbortButton = btnCancel; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment