Получение элементов с помощью LINQ иногда не работает

#vb.net #linq #lambda #predicate

#vb.net #linq #лямбда #предикат

Вопрос:

Я очень новичок в VB, пожалуйста, помогите мне, что не так с моим кодом, я больше не представляю, как достичь цели, то есть:
В методе ComboBox.selectedIndexChange я получаю пользовательский элемент управления (drawTree) с помощью LINQ со страницы TabPage, затем с помощью делегата предиката я получаю текущий набор категорий, потому что его записи необходимо сбросить с помощью записей drawTree.
Извлечение из кода:

 Private Sub category_SelectedIndexChanged(sender As Object, e As EventArgs) Handles pool4Combo.SelectedIndexChanged, pool8Combo.SelectedIndexChanged, Pool16Combo.SelectedIndexChanged, Pool32Combo.SelectedIndexChanged
        Dim selectedCombo As ComboBox = sender
        If Not selectedCombo.SelectedIndex = -1 Then
            Dim selectedCategorySet As CategorySet = selectedCombo.SelectedItem
            Dim holder As TabPage = selectedCombo.Parent

            Dim drawTrees = From controls In holder.Controls.OfType(Of DrawTree)
                            Select controls
            Dim drawTree As DrawTree = CType(drawTrees(0), DrawTree)
            Dim pool As PoolSet = CType(context.Pools.Find(Function(n) (n.PoolName.Equals(holder.Name))), PoolSet)
            Dim cat As CategorySet = CType(pool.Categories.Find(Function(n) (n.CategoryName.Equals(selectedCategorySet.CategoryName))), CategorySet)
            cat.Entries = drawTree.getEntries()

            While holder.Controls.Count > 1
                holder.Controls.RemoveAt(holder.Controls.Count - 1)
            End While
            etc.
            etc.
            etc.
        End If
    End Sub
  

Итак, проблема в том, что при выполнении этого кода drawTree.getEntries() будет Nothing , однако, если я закомментирую объявления pool и cat и просто распечатаю drawTree.getEntries() , он будет содержать нужные мне записи.
Почему это и как это решить?
Большое спасибо!

Комментарии:

1. Те две строки, которые устанавливают drawTrees и drawTree , должны свернуться в Dim drawTree = holder.Controls.OfType(Of DrawTree)().First() . Если их никогда не будет больше одного, используйте Single вместо First .

2. В вашем коде нет ничего очевидного, что объясняло бы вашу проблему. Вам нужно правильно отладить код. Если drawTree.getEntries() возвращает Nothing с двумя предыдущими строками на месте, а не без них, то что-то в этих двух строках влияет на данные, которые вы ожидаете получить этим методом. Правильная отладка покажет вам, что это такое.

3. Спасибо, я изменил drawtree объявление. Я много отлаживаю, но не могу решить эту проблему. Это была попытка чего-то большего (сохраните предыдущие варианты со списком), теперь я знаю, проблемы начинаются, когда я добавляю эту единственную строку: Dim drawTree = holder.Controls.OfType(Of DrawTree)().Single() В этом drawtree есть предыдущие данные со списком, поэтому они мне действительно нужны. Без этого я не могу сохранить предыдущее состояние, при этом текущее drawTree не будет отображаться. Должен ли я отредактировать код, чтобы показать все? Большое спасибо, jmcilhinney, я видел много ваших решений, скоро я напишу новый вопрос на основе одного из них.

4. Хорошо, благодаря упомянутой отладке я понял, что в результате было два drawTrees , и я имел дело с неправильным :/