예제 #1
0
        protected override bool SetValueInternal(object value, ValueUpdateSource updateSource)
        {
            bool result = false;

#if _DOTNET2
            NullableConverter nc = TypeConverter as NullableConverter;
            if ((value == null) || ((value != null) && UnderlyingType.IsInstanceOfType(value)) ||
                ((nc != null) && ((value == null) || nc.UnderlyingType.IsInstanceOfType(value))))
#else
            if ((value != null) && UnderlyingType.IsInstanceOfType(value))
#endif
            {
                UnderlyingValue = value;
                result          = true;
            }

            if (updateSource != ValueUpdateSource.FromChild)
            {
                if ((mOwnerEnumerator != null) &&   // mOwnerEnumerator could be null for the boolean of Property._enabledVariable
                    !mOwnerEnumerator.Property.Value.NoLinkWithChildren)
                {
                    PropertyTypeDescriptorContext context = GetTypeDescriptorContext(OwnerEnumerator);
                    if (TypeConverter.GetPropertiesSupported(context) == false)
                    {
                        PropertyEnumerator childEnum = mOwnerEnumerator.Children;
                        if (childEnum.Count > 0)
                        {
                            string masterStr = mOwnerEnumerator.Property.Value.GetStringValue();

                            char separator = mOwnerEnumerator.Property.Value.GroupedValueSeparator;
                            while (childEnum != childEnum.RightBound)
                            {
                                masterStr.TrimStart(null);

                                int count = masterStr.IndexOf(separator);

                                if (count != -1)
                                {
                                    childEnum.Property.Value.SetValue(masterStr.Substring(0, count));
                                    if (count + 2 < masterStr.Length)
                                    {
                                        masterStr = masterStr.Substring(count + 2); // advance after the separator and the leading space
                                    }
                                }
                                else
                                {
                                    childEnum.Property.Value.SetValue(masterStr);
                                    break;
                                }

                                childEnum.MoveNext();
                            }
                        }
                    }
                }
            }

            return(result);
        }
예제 #2
0
        protected override bool SetValueInternal(object value, ValueUpdateSource updateSource)
        {
            bool result;

            // Update the new value of this property
            if (value is string)
            {
                if (UnderlyingType.IsEnum)
                {
                    object enumValue = TypeConverter.ConvertFromString(GetTypeDescriptorContext(OwnerEnumerator),
                                                                       CultureInfo, GetActualString(value as string));

                    // If the enum is flagged, we don't test if the value to be assigned is correct
                    if (UnderlyingType.IsDefined(typeof(FlagsAttribute), false))
                    {
                        result = SetMultipleValues(enumValue);
                    }
                    else
                    {
                        if (Enum.IsDefined(UnderlyingType, enumValue))
                        {
                            result = SetMultipleValues(enumValue);
                        }
                        else
                        {
                            result = false;
                        }
                    }
                }
                else
                {
                    PropertyTypeDescriptorContext context = GetTypeDescriptorContext(OwnerEnumerator);
                    string str = GetActualString(value as string);
                    if (TypeConverter.CanConvertFrom(context, typeof(string)))
                    {
                        result = SetMultipleValues(TypeConverter.ConvertFromString(
                                                       context, CultureInfo, str));
                    }
                    else
                    {
                        result = SetMultipleValues(str);
                    }
                }
            }
            else
            {
                result = SetMultipleValues(value);
            }

            return(result);
        }
예제 #3
0
        protected override bool SetValueInternal(object value, ValueUpdateSource updateSource)
        {
            try
            {
                PropertyValue parentValue = mOwnerEnumerator.Parent.Property.Value;
                TypeConverter converter   = parentValue.TypeConverter;

                PropertyTypeDescriptorContext context    = GetTypeDescriptorContext(OwnerEnumerator);
                PropertyDescriptorCollection  collection = converter.GetProperties(context, parentValue.GetValue());

                if (collection != null)
                {
                    IDictionary dictionary = new Hashtable(collection.Count);
                    foreach (PropertyDescriptor propertyDescriptor in collection)
                    {
                        if (OwnerEnumerator.Property.Name.Equals(propertyDescriptor.Name))
                        {
                            if (value is string)
                            {
                                dictionary[propertyDescriptor.Name] = TypeConverter.ConvertFromString(
                                    context, CultureInfo, GetActualString(value as string));
                            }
                            else
                            {
                                dictionary[propertyDescriptor.Name] = value;
                            }
                        }
                        else
                        {
                            dictionary[propertyDescriptor.Name] = propertyDescriptor.GetValue(TargetInstance);
                        }
                    }

                    // Create the parent value from all the sibling values
                    PropertyDescriptor.SetValue(TargetInstance, value);
                    parentValue.SetValue(converter.CreateInstance(context, dictionary), ValueUpdateSource.FromChild);
                }
            }
            catch (Exception)
            {
                return(false);
            }

            return(true);
        }
예제 #4
0
        protected override bool SetValueInternal(object value, ValueUpdateSource updateSource)
        {
            try
            {
                PropertyValue parentValue = mOwnerEnumerator.Parent.Property.Value;
                TypeConverter converter = parentValue.TypeConverter;

                PropertyTypeDescriptorContext context = GetTypeDescriptorContext(OwnerEnumerator);
                PropertyDescriptorCollection collection = converter.GetProperties(context, parentValue.GetValue());

                if (collection != null)
                {
                    IDictionary dictionary = new Hashtable(collection.Count);
                    foreach (PropertyDescriptor propertyDescriptor in collection)
                    {
                        if (OwnerEnumerator.Property.Name.Equals(propertyDescriptor.Name))
                        {
                            if (value is string)
                            {
                                dictionary[propertyDescriptor.Name] = TypeConverter.ConvertFromString(
                                    context, CultureInfo, GetActualString(value as string));
                            }
                            else
                                dictionary[propertyDescriptor.Name] = value;
                        }
                        else
                            dictionary[propertyDescriptor.Name] = propertyDescriptor.GetValue(TargetInstance);
                    }

                    // Create the parent value from all the sibling values
                    PropertyDescriptor.SetValue(TargetInstance, value);
                    parentValue.SetValue(converter.CreateInstance(context, dictionary), ValueUpdateSource.FromChild);
                }
            }
            catch (Exception)
            {
                return false;
            }

            return true;
        }
예제 #5
0
 /// <summary>
 /// Modifies the content of the underlying value.
 /// </summary>
 /// <param name="value">The object from which content must be assigned to the underlying value.</param>
 /// <param name="updateSource"></param>
 /// <returns>A boolean is the underlying value was successfully changed, false otherwise.</returns>
 protected virtual bool SetValueInternal(object value, ValueUpdateSource updateSource)
 {
     return false;
 }
예제 #6
0
        protected internal ValueValidationResult SetValue(object value, ValueUpdateSource updateSource)
        {
            bool result;
            try
            {
                result = SetValueInternal(value, updateSource);
            }
            catch (Exception e)
            {
                _lastExceptionByClient = e;
                return ValueValidationResult.ExceptionByClient;
            }

            if (result && (mOwnerEnumerator != null)) // mOwnerEnumerator could be null for the boolean of Property._enabledVariable
            {
//                RecreateChildProperties();

                // Inform its parent that this value has changed
                if (updateSource != ValueUpdateSource.FromParent)
                {
                    if ((mOwnerEnumerator.Parent.Property != null) && (mOwnerEnumerator.Parent.Property.Value != null) &&
                        (mOwnerEnumerator.Parent.Property.Value.NoLinkWithChildren == false))
                        mOwnerEnumerator.Parent.Property.Value.OnChildValueChanged(this);
                }

                if ((mOwnerEnumerator.Children.Count > 0) && (updateSource != ValueUpdateSource.FromChild) &&
                    (NoLinkWithChildren == false))
                {
                    // Inform its children that this value has changed
                    PropertyEnumerator childEnum = mOwnerEnumerator.Children;
                    while (childEnum != childEnum.RightBound)
                    {
                        if (childEnum.Property.Value != null)
                            childEnum.Property.Value.OnParentValueChanged(this);
                        childEnum.MoveNext();
                    }

                    ReUpdateFromChildren();
                }

                Control inplaceCtrl = mOwnerEnumerator.Property.ParentGrid.InPlaceControl;
                IInPlaceControl iinplaceCtrl = inplaceCtrl as IInPlaceControl;

                if ((iinplaceCtrl != null) && !_setValueFromInPlaceCtrl && (iinplaceCtrl.OwnerPropertyEnumerator == mOwnerEnumerator))
                    // If there is an inplace control for this value, then update its content
                    iinplaceCtrl.OwnerPropertyEnumerator = mOwnerEnumerator;
                else
                    // Else just redraw the grid
                    mOwnerEnumerator.Property.ParentGrid.Grid.Invalidate();
            }

            return (result ? ValueValidationResult.Validated : ValueValidationResult.TypeConverterFailed);
        }
예제 #7
0
        protected override bool SetValueInternal(object value, ValueUpdateSource updateSource)
        {
            bool result = false;

#if _DOTNET2
            NullableConverter nc = TypeConverter as NullableConverter;
            if ((value == null) || ((value != null) && UnderlyingType.IsInstanceOfType(value)) ||
                ((nc != null) && ((value == null) || nc.UnderlyingType.IsInstanceOfType(value))))
#else
            if ((value != null) && UnderlyingType.IsInstanceOfType(value))
#endif
            {
                UnderlyingValue = value;
                result = true;
            }

            if (updateSource != ValueUpdateSource.FromChild)
            {
                if ((mOwnerEnumerator != null) &&   // mOwnerEnumerator could be null for the boolean of Property._enabledVariable
                    !mOwnerEnumerator.Property.Value.NoLinkWithChildren)
                {
                    PropertyTypeDescriptorContext context = GetTypeDescriptorContext(OwnerEnumerator);
                    if (TypeConverter.GetPropertiesSupported(context) == false)
                    {
                        PropertyEnumerator childEnum = mOwnerEnumerator.Children;
                        if (childEnum.Count > 0)
                        {
                            string masterStr = mOwnerEnumerator.Property.Value.GetStringValue();

                            char separator = mOwnerEnumerator.Property.Value.GroupedValueSeparator;
                            while (childEnum != childEnum.RightBound)
                            {
                                masterStr.TrimStart(null);

                                int count = masterStr.IndexOf(separator);

                                if (count != -1)
                                {
                                    childEnum.Property.Value.SetValue(masterStr.Substring(0, count));
                                    if (count + 2 < masterStr.Length)
                                        masterStr = masterStr.Substring(count + 2); // advance after the separator and the leading space
                                }
                                else
                                {
                                    childEnum.Property.Value.SetValue(masterStr);
                                    break;
                                }

                                childEnum.MoveNext();
                            }
                        }
                    }
                }
            }

            return result;
        }
        protected override bool SetValueInternal(object value, ValueUpdateSource updateSource)
        {
            bool result = true;

            // If the user tries to set the value as a string
            if ((value != null) && (value.GetType() == typeof(string)))
            {
                if (UnderlyingType == typeof(string))
                {
                    try
                    {
                        // We set the value directly to the underlying data (to its C# Field or Property)
                        if (_memberInfo.MemberType == MemberTypes.Property)
                            ((PropertyInfo)_memberInfo).GetSetMethod(true).Invoke(_targetInstance, new object[] { value });
                        else
                            ((FieldInfo)_memberInfo).SetValue(_targetInstance, value);
                    }
                    catch (ArgumentException)
                    {
                        result = false;
                    }
                }
                else
                {
                    try
                    {
                        string newString = GetActualString(value as string);
                        if (newString != null)
                        {

                            if (_memberInfo.MemberType == MemberTypes.Property)
                                ((PropertyInfo)_memberInfo).GetSetMethod(true).Invoke(_targetInstance, new object[] {
                                    TypeConverter.ConvertFromString(GetTypeDescriptorContext(OwnerEnumerator),
                                    CultureInfo, newString) });
                            else
                                ((FieldInfo)_memberInfo).SetValue(_targetInstance, TypeConverter.ConvertFromString(
                                    GetTypeDescriptorContext(OwnerEnumerator), CultureInfo, newString));
                        }
                        else
                        {
                            if (_memberInfo.MemberType == MemberTypes.Property)
                                ((PropertyInfo)_memberInfo).GetSetMethod(true).Invoke(_targetInstance, new object[] {
                                    TypeConverter.ConvertFromString(GetTypeDescriptorContext(OwnerEnumerator),
                                    CultureInfo, value as string) });
                            else
                                ((FieldInfo)_memberInfo).SetValue(_targetInstance, TypeConverter.ConvertFromString(
                                    GetTypeDescriptorContext(OwnerEnumerator), CultureInfo, value as string));
                        }
                    }
                    catch (Exception)
                    {
                        result = false;
                    }
                }
            }

            // Else if the user doesn't try to set the value as a string
            else
            {
                try
                {
                    // We set the value directly to the underlying data (to its C# Field or Property)
                    if (_memberInfo.MemberType == MemberTypes.Property)
                        ((PropertyInfo)_memberInfo).GetSetMethod(true).Invoke(_targetInstance, new object[] { value });
                    else
                        ((FieldInfo)_memberInfo).SetValue(_targetInstance, value);
                }
                catch (ArgumentException)
                {
                    result = false;
                }
            }

            if (updateSource != ValueUpdateSource.FromChild)
            {
                if (mOwnerEnumerator != null)   // mOwnerEnumerator could be null for the boolean of Property._enabledVariable
                {
                    PropertyEnumerator childEnum = mOwnerEnumerator.Children;
                    if (childEnum.Count > 0)
                    {
                        string masterStr = mOwnerEnumerator.Property.Value.GetStringValue();

                        char separator = mOwnerEnumerator.Property.Value.GroupedValueSeparator;
                        while (childEnum != childEnum.RightBound)
                        {
                            masterStr.TrimStart(null);

                            int count = masterStr.IndexOf(separator);

                            if (count != -1)
                            {
                                childEnum.Property.Value.SetValue(masterStr.Substring(0, count));
                                if (count + 2 < masterStr.Length)
                                    masterStr = masterStr.Substring(count + 2); // advance after the separator and the leading space
                            }
                            else
                            {
                                childEnum.Property.Value.SetValue(masterStr);
                                break;
                            }

                            childEnum.MoveNext();
                        }
                    }
                }
            }

            return result;
        }
예제 #9
0
        protected override bool SetValueInternal(object value, ValueUpdateSource updateSource)
        {
            bool result;

            // Update the new value of this property
            if (value is string)
            {
                if (UnderlyingType.IsEnum)
                {
                    object enumValue = TypeConverter.ConvertFromString(GetTypeDescriptorContext(OwnerEnumerator),
                        CultureInfo, GetActualString(value as string));

                    // If the enum is flagged, we don't test if the value to be assigned is correct
                    if (UnderlyingType.IsDefined(typeof(FlagsAttribute), false))
                        result = SetMultipleValues(enumValue);
                    else
                    {
                        if (Enum.IsDefined(UnderlyingType, enumValue))
                            result = SetMultipleValues(enumValue);
                        else
                            result = false;
                    }
                }
                else
                {
                    PropertyTypeDescriptorContext context = GetTypeDescriptorContext(OwnerEnumerator);
                    string str = GetActualString(value as string);
                    if (TypeConverter.CanConvertFrom(context, typeof(string)))
                    {
                        result = SetMultipleValues(TypeConverter.ConvertFromString(
                            context, CultureInfo, str));
                    }
                    else
                    {
                        result = SetMultipleValues(str);
                    }
                }
            }
            else
                result = SetMultipleValues(value);
            
            return result;
        }
예제 #10
0
        protected override bool SetValueInternal(object value, ValueUpdateSource updateSource)
        {
            bool result = true;

            // If the user tries to set the value as a string
            if ((value != null) && (value.GetType() == typeof(string)))
            {
                if (UnderlyingType == typeof(string))
                {
                    try
                    {
                        // We set the value directly to the underlying data (to its C# Field or Property)
                        if (_memberInfo.MemberType == MemberTypes.Property)
                        {
                            ((PropertyInfo)_memberInfo).GetSetMethod(true).Invoke(_targetInstance, new object[] { value });
                        }
                        else
                        {
                            ((FieldInfo)_memberInfo).SetValue(_targetInstance, value);
                        }
                    }
                    catch (ArgumentException)
                    {
                        result = false;
                    }
                }
                else
                {
                    try
                    {
                        string newString = GetActualString(value as string);
                        if (newString != null)
                        {
                            if (_memberInfo.MemberType == MemberTypes.Property)
                            {
                                ((PropertyInfo)_memberInfo).GetSetMethod(true).Invoke(_targetInstance, new object[] {
                                    TypeConverter.ConvertFromString(GetTypeDescriptorContext(OwnerEnumerator),
                                                                    CultureInfo, newString)
                                });
                            }
                            else
                            {
                                ((FieldInfo)_memberInfo).SetValue(_targetInstance, TypeConverter.ConvertFromString(
                                                                      GetTypeDescriptorContext(OwnerEnumerator), CultureInfo, newString));
                            }
                        }
                        else
                        {
                            if (_memberInfo.MemberType == MemberTypes.Property)
                            {
                                ((PropertyInfo)_memberInfo).GetSetMethod(true).Invoke(_targetInstance, new object[] {
                                    TypeConverter.ConvertFromString(GetTypeDescriptorContext(OwnerEnumerator),
                                                                    CultureInfo, value as string)
                                });
                            }
                            else
                            {
                                ((FieldInfo)_memberInfo).SetValue(_targetInstance, TypeConverter.ConvertFromString(
                                                                      GetTypeDescriptorContext(OwnerEnumerator), CultureInfo, value as string));
                            }
                        }
                    }
                    catch (Exception)
                    {
                        result = false;
                    }
                }
            }

            // Else if the user doesn't try to set the value as a string
            else
            {
                try
                {
                    // We set the value directly to the underlying data (to its C# Field or Property)
                    if (_memberInfo.MemberType == MemberTypes.Property)
                    {
                        ((PropertyInfo)_memberInfo).GetSetMethod(true).Invoke(_targetInstance, new object[] { value });
                    }
                    else
                    {
                        ((FieldInfo)_memberInfo).SetValue(_targetInstance, value);
                    }
                }
                catch (ArgumentException)
                {
                    result = false;
                }
            }

            if (updateSource != ValueUpdateSource.FromChild)
            {
                if (mOwnerEnumerator != null)   // mOwnerEnumerator could be null for the boolean of Property._enabledVariable
                {
                    PropertyEnumerator childEnum = mOwnerEnumerator.Children;
                    if (childEnum.Count > 0)
                    {
                        string masterStr = mOwnerEnumerator.Property.Value.GetStringValue();

                        char separator = mOwnerEnumerator.Property.Value.GroupedValueSeparator;
                        while (childEnum != childEnum.RightBound)
                        {
                            masterStr.TrimStart(null);

                            int count = masterStr.IndexOf(separator);

                            if (count != -1)
                            {
                                childEnum.Property.Value.SetValue(masterStr.Substring(0, count));
                                if (count + 2 < masterStr.Length)
                                {
                                    masterStr = masterStr.Substring(count + 2); // advance after the separator and the leading space
                                }
                            }
                            else
                            {
                                childEnum.Property.Value.SetValue(masterStr);
                                break;
                            }

                            childEnum.MoveNext();
                        }
                    }
                }
            }

            return(result);
        }