// Memorizza in _editingProperties tutte le proprietà editable private void InitializeEditingProperties() { // Per ogni proprietà pubblica di EditingObject alla quale è stato associato l’attributo Editable: // se la proprietà è write-only, sollevare un’eccezione; // creare una nuova EditingProperty sulla proprietà e aggiungerla alla collezione _editingProperties; // visualizzare nella finestra di output del debugger la descrizione completa dell'EditingProperty // ad esempio: "Add EditingProperty Titolo {Label = Titolo, Width = 100} OriginalValue = TitoloLibro_1" Type type = EditingObject.GetType(); foreach (PropertyInfo propertyInfo in type.GetProperties()) { EditableAttribute[] attributes = (EditableAttribute[])propertyInfo.GetCustomAttributes(typeof(EditableAttribute), false); if (attributes.Length == 0) { continue; } if (!propertyInfo.CanRead) { throw new ApplicationException("Attributo editable non applicabile"); } EditingProperty editingProperty = new EditingProperty(propertyInfo, attributes[0], EditingObject); _editingProperties.Add(editingProperty); Console.WriteLine("Add EditingProperty " + editingProperty.ToString()); } }
// Crea, inizializza e aggiunge al Target.TableLayoutPanel nell’ordine: una Label e una TextBox. private void AddRow(EditingProperty editingProperty) { // Per inizializzare la Label: // assegnare alla proprietà Text il valore della proprietà Label di editableAttribute; // assegnare alla proprietà AutoSize il valore true, in modo che il testo venga visualizzato correttamente. // Per inizializzare la TextBox: // dimensionare il controllo in modo che // la larghezza sia pari al valore della proprietà Width di editableAttribute e // l’altezza sia pari al valore della proprietà PreferredHeight del controllo stesso; // se la editingProperty è read-only, // disabilitare la TextBox (utilizzare la proprietà Enabled); // assegnare alla proprietà Tag il valore di editingProperty; // infine, collegare all’evento Validating della TextBox il gestore ValidatingHandler. Label label = new Label(); label.AutoSize = true; label.Text = editingProperty.Label; TextBox textbox = new TextBox(); textbox.Width = editingProperty.Width; textbox.Height = textbox.PreferredHeight; if (!editingProperty.PropertyInfo.CanWrite) { textbox.Enabled = false; } textbox.Tag = editingProperty; textbox.Validating += ValidatingHandler; Target.TableLayoutPanel.Controls.Add(label); Target.TableLayoutPanel.Controls.Add(textbox); }
// Esegue la validazione vera e propria del dato contenuto nella textBox passata come argomento. private void Validate(TextBox textBox) { // Recuperare la editingProperty dalla textBox. // Invocare in modo opportuno i metodi TryConvertFromString e TrySetValue dell'editingProperty. // Infine, aggiornare l'ErrorProvider per segnalare all'utente che la textBox è con o senza errori. Object value; EditingProperty property = (EditingProperty)textBox.Tag; if (property.TryConvertFromString(textBox.Text, out value)) { property.TrySetValue(value); } Target.ErrorProvider.SetError(textBox, property.Message); }
// Inserisce nelle TextBox i valori delle corrispondenti proprietà dell'editingObject. private void RefreshTextBoxes(TextBox excludedTextBox) { // Per ogni textBox contenuta in Target.TableLayoutPanel, ad esclusione di excludedTextBox: // recuperare la editingProperty precedentemente salvata nella proprietà Tag di textBox; // assegnare alla proprietà Text di textBox il valore corrente dell'editingProperty come stringa di caratteri; // infine, se la editingProperty è writable, invocare il metodo Validate passando come argomento textBox. foreach (Control control in Target.TableLayoutPanel.Controls) { if (control is TextBox && !((TextBox)control).Equals(excludedTextBox)) { EditingProperty property = (EditingProperty)control.Tag; control.Text = property.ConvertToString(); if (property.CanWrite) { Validate((TextBox)control); } } } }