//  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());
            }
        }
示例#2
0
        //  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);
        }
示例#3
0
        //  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);
        }
示例#4
0
        //  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);
                    }
                }
            }
        }