DisplayMember получает сброс на DataSource = null - PullRequest
8 голосов
/ 13 марта 2009

У меня есть ComboBox, элементы которого устанавливаются с помощью свойства DataSource. DataSource - это коллекция пользовательского объекта (, который имеет строковое свойство 'Value' и свойство int 'Id' ). В элементах инициализации я установил DisplayMember как Значение и ValueMember как Id . Теперь я попытался очистить источник данных, вызвав,

myComboBox.DataSource = null;

Когда я это сделал, мой DisplayMember автоматически сбрасывается на "". Я правильно очищаю источник данных ?? Это то, как я должен вести себя ???

Ответы [ 2 ]

3 голосов
/ 13 марта 2009

Я могу воспроизвести его ... это не то, чего я ожидал, но похоже, что вам просто придется потом установить DisplayMember.

Глядя в отражатель, это довольно преднамеренно:

        if (value == null)
        {
            this.DisplayMember = "";
        }

Не уверен в аргументации , стоящей за этим, но просто:

string oldDisplayMember = cbo.DisplayMember;
cbo.DataSource = null;
cbo.DisplayMember = oldDisplayMember;

Не красиво, но это сработает.

0 голосов
/ 07 июля 2015

Когда возникает исключение или значение источника данных равно нулю, для Displaymember устанавливается пустая строка.

Используя декомпилятор кода .NET, в коде есть комментарии о том, как это работает. Я попробую перефразировать.

Исключения могут быть вызваны в следующих случаях:

  1. Код приложения на DataSourceChanged
  2. Во время связывания, когда данные форматируются для отображения
  3. Если значение DisplayMember недопустимо в новом источнике данных.

В комментарии также упоминается, что фактическое исключение "проглочено", чтобы не нарушать ожидаемое поведение.

Я лично столкнулся с таким поведением, и поскольку исключение не выдается, трудно выяснить, какое из этих условий вызвало сброс. Возможно, есть лучший способ, но сейчас я использую это в своем пользовательском элементе управления. Свойство Datasource допустимо при установке DisplayMember после его сброса, поэтому я действительно не уверен, почему это происходит сбой:

    public new object DataSource
    {
        get { return base.DataSource; }
        set
        {
            string displayMem = this.DisplayMember;
            base.DataSource = value;
            if (string.IsNullOrEmpty(this.DisplayMember) && string.IsNullOrEmpty(displayMem)) 
                this.DisplayMember = displayMem;
            DetermineDropDownWidth();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...