Цикл по таблице данных, чтобы получить значение - PullRequest
0 голосов
/ 22 марта 2019

У меня есть DataTable с несколькими строками.Я использую цикл foreach для циклического прохождения каждого элемента и возврата имени.Это возвращает то же самое (1-е) значение для каждой строки.Что я сделал не так?

            DataTable table = new DataTable();
            table.Columns.Add("tag", typeof(string));
            string name = hfSelected.Value;
            string[] names = name.Split(',');
            for (int i = 0; i < names.Length; i++)
                table.Rows.Add(new object[] { names[i] });                  
            DataRow row = table.Rows[0];

            foreach (var item in table.Rows)
            {

                Value = row["tag"].ToString() // this is returning the same value for both items in the table.

            }

Ответы [ 3 ]

2 голосов
/ 22 марта 2019

В комментарии вы упомянули, что получаете сообщение об ошибке:

не может применить индексирование с помощью [] к выражению типа объекта

при попытке доступа к item["tag"] в цикле foreach.

Вам необходимо явно объявить DataRow в foreach.

// declare DataRow here, not var 
foreach (DataRow item in table.Rows)
{
    // use item here
    Value = item["tag"].ToString();    // use += to concatenate string
}

Причина в том, что DataRowCollection реализует неуниверсальный IEnumerable, поэтому вы индексируете object вместо DataRow. Приведенное выше решение приводит к DataRow.

Я бы порекомендовал посмотреть методы Field<T>() и AsEnumerable() из System.Data.DataSetExtensions. AsEnumerable () возвращает IEnumerable<DataRow>. Поле () обеспечивает строго типизированный доступ к значениям (т. Е. Он преобразует / преобразовывает типы для вас).

Тогда вы можете сделать:

foreach (var item in table.AsEnumerable())
{
    // item is a DataRow here
    var myString = item.Field<string>("tag");     // gets string

    // you can also do
    var myInt = item.Field<int>("Id");            // gets int
    var myDate = item.Field<DateTime?>("Date");   // gets nullable DateTime?
    var myValue = item.Field<decimal>("Price");   // gets decimal
}
0 голосов
/ 22 марта 2019

Карл прав, это выдает тот же результат, потому что внутри итерации вы все время используете одну и ту же строку. Вы должны использовать «item» вместо «row» (вам вообще не нужен «row»).

Исключение, которое вы получаете, связано с тем, что вы объявили "item" с динамическим типом, это

 foreach (var item in table.Rows)

Вы можете попробовать

 foreach (DataRow item in table.Rows)

таким образом, вы сможете получить информацию о столбце.

0 голосов
/ 22 марта 2019

кажется, что ваша итерация использует ту же переменную 'row' вместо переменной 'item', которую вы определили в операторе foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...