Почему этот запрос Linq не по словарюработая как источник данных - PullRequest
2 голосов
/ 21 декабря 2010

У меня есть следующее в VB:

Dim sources = From source In importSources Select New With _
    {.Type = source.Key, .Source = source.Value.Name}

dgridSourceFiles.DataSource = sources

Когда я отлаживаю, sources показывает запрос в памяти и имеет 2 записи в.Тем не менее, представление таблицы данных не будет показывать записи.

Так почему же это не сработает? предложения могут быть VB или C # ...

Обновить

Когда я использую:

Dim sources = (From source In importSources Select New With _
    {.Type = source.Key, .Source = source.Value.Name}).ToList()

... отображается источник данных.

Ответы [ 2 ]

6 голосов
/ 21 декабря 2010

Ваш запрос LINQ лениво оценивается и реализует только интерфейс IEnumerable<T> (насколько я знаю), что означает, что его результаты не устанавливаются до тех пор, пока перечислитель не вызовет MoveNext где-нибудь (как это происходит в цикле foreach, например).

Кажется, свойство DataSource не перечисляет свое содержимое таким образом. Он полностью ожидает реализацию IList (или одного из нескольких других интерфейсов - см. Ниже), чтобы он мог получить доступ к элементам по индексу. Это используется внутренне элементом управления для сортировки, фильтрации и т. Д. Имея это в виду, вполне вероятно, что все установки свойства DataSource проверяют тип объекта, чтобы увидеть, реализует ли он какой-либо из поддерживаемых интерфейсов. Поэтому я не думаю, что свойство DataSource предназначено для работы с этим типом объекта (запрос с ленивой оценкой).

Теперь этот вызов ToList заполняет List<T> результатами вашего запроса; этот выполняет реализацию IList и поэтому может использоваться как DataSource.

Насколько я понимаю, причина DataSource, введенная просто как object, заключается в том, что она ожидает любой следующих интерфейсов:

  • IList
  • IListSource (в этом случае метод IListSource.GetList используется вместе со свойством DataMember для предоставления данных элементу управления)
  • IBindingList (который распространяет изменения в списке на элемент управления для обновлений пользовательского интерфейса)
  • IBindingListView (например, BindingSource)

Это соответствует документации MSDN .

1 голос
/ 21 декабря 2010

Возможно, вам потребуется вызвать DataBind после установки источника.Попробуйте:

dgridSourceFiles.DataSource = sources
dgridSourceFiles.DataBind()
...