Member 11040029 Ответов: 1

Странное поведение datagridview


Сегодня я столкнулся со странным поведением datagridview.
Это было, когда я пытался прикрепить коллекцию моделей POCO к gridview.
Класс POCO выглядит следующим образом:

class SchemaTaxClass
   {
       internal short ID { get; set; }
       internal short TAXCATEGORY_ID { get; set; }
       internal string NAME { get; set; }
       internal string ACRONYM { get; set; }
       internal System.DateTime EFFECTIVEFROM { get; set; }
       internal string DESCRIPTION { get; set; }
       internal System.DateTime CREATEDON { get; set; }
       internal bool ISACTIVE { get; set; }
   }


Все свойства являются внутренними.

В основном классе у меня есть:
public partial class TaxationUtils : Form
    {   
        List<Taxation.PrivateData.Schemas.SchemaTaxClass< _taxClassesCollection;
        Taxation.PrivateData.TaxClassCollection _clsTaxClassCollection;

        public TaxationUtils()
        {
            InitializeComponent();
            SynchronizeTaxClassCollection();
        }
        void SynchronizeTaxClassCollection()
        {
            try
            {
                GetOrRefreshTaxClassCollection(null);
                PopulateGridWithExistingTaxClasses();
            }
            catch (Exception ex)
            {
                AppendMsg(ex.ToString());
            }
        }
        void GetOrRefreshTaxClassCollection(short? taxCategoryID)
        {
            try
            {
                if (_clsTaxClassCollection == null)
                    _clsTaxClassCollection = new PrivateData.TaxClassCollection(taxCategoryID);
                _taxClassesCollection = _clsTaxClassCollection.GetTaxClassCollection;
            }
            catch (Exception ex)
            {                
                throw ex;
            }
        }
        void PopulateGridWithExistingTaxClasses()
        {
            dgv_ExistingTaxClasses.DataSource = _taxClassesCollection.ToList();       
        }
}



Это класс данных, из которого мы извлекаем данные (через Entity Framework)
class TaxClassCollection
  {
      short? _taxCategoryID = null;
      bool FLAG_ERR;
      List<SchemaTaxClass> _taxClassList = null;
      internal TaxClassCollection(short? taxCategoryID)
      {
          this._taxCategoryID = taxCategoryID;
      }

      internal List<SchemaTaxClass> GetTaxClassCollection
      {
          get
          {
              FLAG_ERR = false;
              try
              {
                  GetTaxClasses();
                  if (!FLAG_ERR && _taxClassList != null)
                      return _taxClassList;
                  else
                      return null;
              }
              catch (Exception ex)
              {
                  throw ex;
              }
          }
          private set
          {
              _taxClassList = (List<SchemaTaxClass>)value;
          }
      }

      void GetTaxClasses()
      {
          _taxClassList = new List<SchemaTaxClass>();
          try
          {
              using (var _context = new vk1_0Entities())
              {
                  _taxClassList = (from taxClass in _context.TAX_CLASS
                                       where taxClass.taxZone_id == BusinessInfo.TaxZoneID
              }
              if (FLAG_ERR)
                  FLAG_ERR = false;
          }
          catch (Exception ex)
          {
              if (!FLAG_ERR)
                  FLAG_ERR = true;
              throw ex;
          }
      }
  }



Что происходит, когда члены класса POCO имеют внутренний модификатор as, gridview не отображает данные.
Если модификатор включен в public, данные становятся видимыми.

Почему такое поведение?

Замечания:
Класс POCO, класс данных и основной класс находятся в одной сборке и пространстве имен.
Кроме того, данные присутствуют в переменной коллекции, используемой в качестве источника данных для gridview.

Что я уже пробовал:

Я попытался изучить представление сетки из MSDN, но не нашел ничего, что могло бы оправдать такое поведение.

Когда все находится в одной сборке и пространстве имен, внутреннее должно работать.

1 Ответов

Рейтинг:
9

OriginalGriff

Это не "странное" поведение - насколько я могу судить, это намеренно, и абсолютно то, что я ожидал.
При привязке источника данных к коллекции схема таблицы строится путем изучения свойств типа данных объекта коллекции с помощью отражения , что означает, что только public свойства могут отображаться так, как класс или сборка, выполняющие привязку, могут не иметь доступа к-public свойства, поэтому они не должны отображаться. Поступить иначе - значит нарушить защиту, заложенную в систему!
Он не будет отображать никаких private, internal, protected, или protected internal свойства-только public.


Member 11040029

Да, это имеет смысл.

Member 11040029

Но как насчет того, чтобы я не хотел раскрывать некоторые свойства класса POCO другим проектам? Обнародование каждого свойства обеспечит доступ к другим объектам в других проектах, чтобы шпионить за свойствами, которым не должен быть предоставлен доступ к ним.

OriginalGriff

Тогда вы не сможете использовать его для заполнения источника данных.
Альтернативой является предоставление ограниченного публичного класса и менее ограничительного внутреннего класса, который инкапсулирует публичный экземпляр и возвращает его внутренние свойства через собственные публичные свойства. Или производные от него и добавляет общедоступные свойства, возвращающие внутренние значения под новым именем (потому что вы не можете изменить модификаторы доступа при переопределении свойств или методов)

Member 11040029

подняв Грифф!

OriginalGriff

Пожалуйста!

Midi_Mick

Вы делаете класс, который привязывается, внутренним. Привязка может получить общедоступные свойства из внутреннего класса ok. Если вам действительно нужно предоставить класс другим проектам, то просто сделайте его внутреннюю версию для целей привязки.

Member 11040029

спасибо Мик!