#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();