Функция не вызывается

#c# #function

#c# #функция

Вопрос:

У меня проблемы с некоторыми частями моего кода, я хочу вызвать метод, но метод не вызывается, и я не знаю почему.

     var rows = GetDataGridRows(dgTickets);
    int intTickets = 0;
    foreach (System.Windows.Controls.DataGridRow r in rows)
    { 
        //some code
    } 

    private IEnumerable<System.Windows.Controls.DataGridRow>
               GetDataGridRows(System.Windows.Controls.DataGrid grid)
    {
       var itemsSource = grid.ItemsSource as IEnumerable;
       if (null == itemsSource) yield return null;
       foreach (var item in itemsSource)
       {
           var row = grid.ItemContainerGenerator.ContainerFromItem(item)
                                 as System.Windows.Controls.DataGridRow;
           if (null != row) yield return row;
       }
    }
  

var rows = GetDataGridRows(dgTickets); не вызывает функцию и просто переходит к int intTickets = 0

Я понятия не имею, что делать

Заранее спасибо

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

1. Вы нажимаете F10 или F11? Можете ли вы уточнить, не вызывает ли функция

2. Вы убедились, что вызов не выполняется с использованием точки останова и пошагового выполнения кода? Или вы хотите сказать, что она не вызывается, потому что вы не получаете желаемый результат?

3. Откуда вы знаете, что GetDataGridRows она не вызывается? Вы ввели в нее точку останова?

Ответ №1:

Ваш метод GetDataGridRows возвращает IEnumerable using yield . Вы не перейдете к этому методу, пока не будет выполнен ваш foreach блок.

Использование yield ключевого слова позволяет компилятору C # использовать свой генератор конечных автоматов для создания реализации, IEnumerable которую он возвращает. IEnumerable используйте отложенный вызов, что по сути означает, что он взаимодействует только тогда, когда это требуется. Здесь вы видите, как она переходит от объявления к следующему шагу, потому что на этом этапе это всего лишь экземпляр IEnuemrable , который еще предстоит циклически выполнить.

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

1. Да, я вижу это, но он не заполняет мои «строки», и в другом месте моего кода я также использую эту функцию, и там она работает

2. @user735646 В таком случае я бы сказал, что вы, возможно, вызываете код в неподходящее время … например, вы вызываете его до того, как сетка будет заполнена данными?

3. Нет, itemssource сетки содержит 13 элементов

Ответ №2:

Я считаю, что вам следует использовать…

 table_id.DataSource = GetDataGridRows(dgTickets);
table_id.DataBind();