#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
, и я имел дело с неправильным :/