Перебирайте данные и изменяйте значения с помощью оператора if - PullRequest
2 голосов
/ 21 сентября 2011

У меня есть дата-данные, которые я пытаюсь использовать для каждого цикла, и оператор if для изменения определенных значений, однако всякий раз, когда я пытаюсь использовать оператор if, ничего не происходит. Если я удаляю оператор if, очевидно, просто меняет каждую строку.

Что я делаю не так? Я пытался с другими значениями ItemArray.GetValue () и до сих пор не повезло.

            int x = 0;
            foreach ( DataRow myRow in dt.Rows )
            {
                if (dt.Rows [x].ItemArray.GetValue(1).ToString()=="IP")
                {
                    myRow.BeginEdit ( );
                    myRow [ "grd" ] = " ";
                    myRow.EndEdit ( );
                }
                x++;
            }

Ответы [ 5 ]

0 голосов
/ 21 сентября 2011

Оказывается, мне нужно было добавить trim (), и это сработало.

    foreach ( DataRow row in dt.Rows )
            {
                string name = row.ItemArray.GetValue ( 2 ).ToString ( ).ToUpper().Trim();

                if ( name == "IP" )
                {
                    row.BeginEdit();
                    row [ "grd" ] = "-";
                    row.EndEdit();
                }
            }
0 голосов
/ 21 сентября 2011

C # чувствителен к регистру, поэтому, скорее всего, фактическое значение не пишется с заглавной буквы «IP», или, возможно, содержит пробел и т. Д. Попробуйте сравнить со строкой. Сравните, используя перегруженную версию, где вы можете использовать ложь для case чувствительность.

Кстати - есть несколько способов проверить значение, которое может быть немного чище.

Во-первых, вы можете использовать метод Select, предоставляемый объектом DataTable, чтобы отфильтровать строки только со столбцами со значением «IP» в столбце с индексом 1. Вам нужно будет использовать имя столбца, поэтому я предполагаю, что он называется "Столбец1" для этого примера:

foreach ( DataRow myRow in dt.Rows.Select("Column1 = 'IP'") )
{
    myRow.BeginEdit();
    myRow["grd"] = " ";
    myRow.EndEdit();
}

В качестве альтернативы вы можете использовать оператор LINQ следующим образом:

foreach (DataRow myRow in dt.Rows.Cast<System.Data.DataRow>().Where(r => string.Compare(r[1].ToString(), "IP", true) == 0)
{
    myRow.BeginEdit();
    myRow["grd"] = " ";
    myRow.EndEdit();
}

Как отмечает Hand-E-Food, переменная "x" в вашем примере не работает.

0 голосов
/ 21 сентября 2011

Убедитесь, что вы инициализируете свои столбцы DataTable, и, что более важно, убедитесь, что вы вставляете значение с индексом = 1. Я запустил следующий код и без проблем оценил оператор if. Я также удалил счетчик, который вы использовали, потому что он не нужен в данном конкретном случае для каждого цикла, так как вы можете получить прямой доступ к ItemArray каждой строки.

  DataTable table = new DataTable();
  table.Columns.Add("ID");    //Allows for storage at GetValue(0)
  table.Columns.Add("NAME");  //Allows for storage at GetValue(1)

  //GetValue(0) will return 128|256; GetValue(1) will return IP | OP.
  table.Rows.Add(new object[] {"128", "IP"});  
  table.Rows.Add(new object[] {"256", "OP"});

  foreach(DataRow row in table.Rows)
  {
        string name = row.ItemArray.GetValue(1).ToString();

        if(name == "IP")
        {
             Console.WriteLine("IP was found");
             //Of course do your edits here.
        }
  }
0 голосов
/ 21 сентября 2011

Какое значение из массива?Это действительно "IP"?Или это одно из следующих: «ip», «Ip», «iP»?Это может помочь .ToUpper () в строке, если регистр не имеет значения.

Чтобы ответить на второй вопрос: если вы используете адаптер данных, вы можете просто заполнить набор данных и вытащить первую таблицу внабор данных.

DataSet ds = new DataSet();
dataAdapter.fill(ds);
DataTable myTable = ds.Tables[0];
0 голосов
/ 21 сентября 2011

Для начала переменная x является лишней.Вы можете просто сослаться на:

if (myRow.ItemArray.GetValue(1).ToString()=="IP")

Это должно уменьшить некоторую путаницу в коде.

Поставьте точку останова в операторе if, чтобы увидеть, каково действительное значение GetValue(1).ToString() находится в каждой итерации цикла.Возможно, вы получаете неправильное значение.

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