// 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.Text = editingProperty.Label; label.AutoSize = true; Target.TableLayoutPanel.Controls.Add(label); Control tb = null; if (editingProperty.Mode == "Combo") { tb = new ComboBox(); if (editingProperty.Label.StartsWith("Tipo")) { Type categoria = typeof(Elemento).GetSubtypes().Where(t => t.Name.ToUpper() == editingProperty.Label.Substring(4).ToUpper()).First(); ((ComboBox)tb).Items.AddRange(Negozio.GetInstance().GetTipiPerCategoria(categoria).ToArray()); ((ComboBox)tb).SelectedItem = ((ComboBox)tb).Items.OfType <TipoElemento>().First(); } else if (editingProperty.Label.StartsWith("Stato")) { ((ComboBox)tb).Items.AddRange(Negozio.GetInstance().StatiElemento.ToArray()); ((ComboBox)tb).SelectedItem = ((ComboBox)tb).Items.OfType <StatoElemento>().First(); } } else { tb = new TextBox(); tb.Height = ((TextBox)tb).PreferredHeight; } tb.Width = editingProperty.Width; tb.Enabled = checkIfEnabled(editingProperty); tb.Tag = editingProperty; tb.Validating += ValidatingHandler; Target.TableLayoutPanel.Controls.Add(tb); }
// Inserisce nelle TextBox i valori delle corrispondenti proprietà dell'editingObject. private void RefreshControls(Control excludedBox) { // 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 tb in Target.TableLayoutPanel.Controls) { if ((tb.GetType().Equals(typeof(TextBox)) || tb.GetType().Equals(typeof(ComboBox))) && !Equals(excludedBox, tb)) { EditingProperty ep = (EditingProperty)tb.Tag; tb.Text = ep.ConvertToString(); tb.Select(); //trick per avere red al load senza usare il metodo Validate ed ottenere ciò che volevamo //ho tolto il blink da View.EditingControl perchè uccide } } Target.TableLayoutPanel.Select(); //celo il trucco }
// Esegue la validazione vera e propria del dato contenuto nella textBox passata come argomento. private void Validate(Control box) { // 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 ep = (EditingProperty)box.Tag; if (box.GetType() == typeof(TextBox) && ep.TryConvertFromString(box.Text, out value)) { ep.TrySetValue(value); } else if (box.GetType() == typeof(ComboBox) && ep.TryConvertFromComboItem(((ComboBox)box).SelectedItem, out value)) { ep.TrySetValue(value); } Target.ErrorProvider.SetError(box, ep.Message); }
// 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 t = EditingObject.GetType(); foreach (PropertyInfo p in t.GetProperties()) { if ((p.GetCustomAttributes(typeof(Model.EditableAttribute), false).Length > 0)) { if (p.CanWrite && !p.CanRead) { throw new ArgumentException("public editable property can not be write only"); } EditingProperty ep = new EditingProperty(p, (Model.EditableAttribute)p.GetCustomAttributes(typeof(Model.EditableAttribute), false)[0], EditingObject); _editingProperties.Add(ep); Console.WriteLine(ep.ToString()); } } }
private bool checkIfEnabled(EditingProperty editingProperty) { return(editingProperty.CanWrite && (!editingProperty.NotEditableAfterFirstTime || (editingProperty.NotEditableAfterFirstTime && _firstEdit))); }