2015-11-24 4 views
2

Я пытаюсь выполнить итерацию по моим строкам RadGridView, но когда у меня есть более 20 или 30 элементов, цикл не получает все строки.WPF - цикл RadGridView через строки. Не удается получить все строки

Например: используя этот код в radgridview с 5 элементами, я могу получить все и делать все, что захочу, но когда моя сетка имеет более 20 элементов, она получает всего 10 строк. Это ошибка или что-то в этом роде? Как я могу это решить?

Вот мой код:

private List<object> ReturnListFounds(string text) 
     { 
      List<object> a = new List<object>(); 
      foreach (var item in myGrid.Items) 
      { 
       if (item == null) 
        continue; 
       GridViewRow row = myGrid.ItemContainerGenerator.ContainerFromItem(item) as GridViewRow; 

       if (row == null) 
        continue; 

       foreach (GridViewCell cell in row.Cells) 
       { 
        if (cell != null && cell.Value != null) 
        { 
         string str = cell.Value.ToString(); 

         if (str.Equals(text, StringComparison.InvariantCultureIgnoreCase) || str.ToLower().Contains(text.ToLower())) 
         { 
          a.Add(row.Item); 
          break; 
         } 
        } 
       } 
      } 

      return a; 
     } 

@Edit

я узнал проблему. Дело в том, что метод «ItemContainerGenerator.ContainerFromItem (item) как GridViewRow» возвращает значение null, если элемент находится за пределами области просмотра. Но я использую этот метод в сетке, содержащей 123 элемента, и я могу получить только строку для 20 первых элементов. Мне нужно получить все предметы, а не только те, которые находятся в области просмотра. Я уже пытался установить виртуализацию false (EnableRowVirtualization = false; EnableColumnVirtualization = false;), но она также не работала.

Есть ли способ получить все строки, используя этот метод?

+0

Зачем вам нужно перебирать элементы VisualTree? – Spawn

+0

Я хочу получить все ячейки из сетки ... Мне нужно его значение для сравнения со строкой, а также мне нужно, чтобы ячейки делали другую вещь. Но самое главное - сравнить значение с String. –

ответ

0

Я пробовал много вещей, чтобы сделать эту работу, и я ее нашел. Это не лучший способ сделать это, но он работает. У меня есть что-то лучше, просто отправьте сюда! Поделитесь с нами!

private List<object> ReturnListFounds(string text) 
     { 
      List<object> result = new List<object>(); 

      for (int l = 0; l <= Items.Count; l++) 
      { 
       var cell = new GridViewCellInfo(this.Items[l], this.Columns[0], this); 

       if (cell.Item != null) 
       { 
        var props = cell.Item.GetType().GetProperties(); 

        foreach (var p in props) 
        { 
         if (p == null || cell.Item == null) 
          continue; 

         var t = p.GetValue(cell.Item); 

         if (t == null) 
          continue; 

         var str = t.ToString(); 
         if (str.Equals(text, StringComparison.InvariantCultureIgnoreCase) || str.ToLower().Contains(text)) 
         { 
          result.Add(cell.Item); 
         } 

        } 
       } 

      } 

      result = new List<object>(result.Distinct()); 

      return result; 
     } 
+0

У вас есть DataContext для RadGridView, почему вы не перебираете его? – Spawn

+0

Я пробовал. Но я устраиваю эту сетку, поэтому код не находится в классе моего основного проекта. Он находится в классе, который связан с ResourceDictionary, и я ставил сетку так, как хочу ... Поэтому я не мог работать с DataContext. Я не знаю, есть ли способ сделать это, но я не мог. –

+0

Ну, это не для WPF, неправильный подход. Насколько я понимаю, вы не используете шаблон MVVM. – Spawn

1

Вы пробовали это?

var rows = StrategyGridView.ChildrenOfType<GridViewRow>(); 

Это прекрасно работает для меня. Надеюсь, поможет!