File: System\Data\DataColumnPropertyDescriptor.cs
Web Access
Project: src\src\libraries\System.Data.Common\src\System.Data.Common.csproj (System.Data.Common)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections;
using System.ComponentModel;
using System.Data.Common;
using System.Diagnostics.CodeAnalysis;
 
namespace System.Data
{
    internal sealed class DataColumnPropertyDescriptor : PropertyDescriptor
    {
        internal DataColumnPropertyDescriptor(DataColumn dataColumn) : base(dataColumn.ColumnName, null)
        {
            Column = dataColumn;
        }
 
        public override AttributeCollection Attributes
        {
            get
            {
                if (typeof(IList).IsAssignableFrom(PropertyType))
                {
                    Attribute[] attrs = new Attribute[base.Attributes.Count + 1];
                    base.Attributes.CopyTo(attrs, 0);
 
                    // we don't want to show the columns which are of type IList in the designer
                    attrs[attrs.Length - 1] = new ListBindableAttribute(false);
                    return new AttributeCollection(attrs);
                }
                else
                {
                    return base.Attributes;
                }
            }
        }
 
        internal DataColumn Column { get; }
 
        public override Type ComponentType => typeof(DataRowView);
 
        public override bool IsReadOnly => Column.ReadOnly;
 
        public override Type PropertyType => Column.DataType;
 
        public override bool Equals([NotNullWhen(true)] object? other) =>
            other is DataColumnPropertyDescriptor descriptor &&
            descriptor.Column == Column;
 
        public override int GetHashCode() => Column.GetHashCode();
 
        public override bool CanResetValue(object component)
        {
            DataRowView dataRowView = (DataRowView)component;
            if (!Column.IsSqlType)
            {
                return (dataRowView.GetColumnValue(Column) != DBNull.Value);
            }
 
            return (!DataStorage.IsObjectNull(dataRowView.GetColumnValue(Column)));
        }
 
        public override object GetValue(object? component)
        {
            DataRowView dataRowView = (DataRowView)component!;
            return dataRowView.GetColumnValue(Column);
        }
 
        public override void ResetValue(object component)
        {
            DataRowView dataRowView = (DataRowView)component;
            dataRowView.SetColumnValue(Column, DBNull.Value); // no need to ccheck for the col type and set Sql...Null!
        }
 
        public override void SetValue(object? component, object? value)
        {
            DataRowView dataRowView = (DataRowView)component!;
            dataRowView.SetColumnValue(Column, value);
            OnValueChanged(component, EventArgs.Empty);
        }
 
        public override bool ShouldSerializeValue(object component) => false;
 
        public override bool IsBrowsable => Column.ColumnMapping == MappingType.Hidden ? false : base.IsBrowsable;
    }
}