Перебирая данные и удаляя строку - PullRequest
7 голосов
/ 24 ноября 2008

Я заполнил Datatable с 2 разных серверов. Я могу внести коррективы, где моя длина> 0, и я хочу удалить строки, которые не попадают Вот краткое изложение того, что у меня

DataRow[] dr = payments.dtPayments.Select(myselect);

if (dr.Length > 0)
{
   for (int a = 0; a < dr.Length; a++)
   {
      if (thisOption == true)
         dr[0].Delete();
      else if (otherOption == true)
      {
         dr[0]["Date"] = myDataReader["date"].ToString().Trim();
         dr[0]["Pay"] = payTypeName(myDataReader["ccdsrc"].ToString()
                                                          .Trim());
      }
   }
}
if (dr.Length == 0)
{                        
   if (LastOption == true)
   {
     //DataRow should be removed
   }                        
}

Ответы [ 5 ]

18 голосов
/ 24 ноября 2008

Я не уверен, что полностью понимаю ваш вопрос, но кажется, что вы пытаетесь удалить запись из коллекции, пока вы все еще просматриваете ее. (что приведет к ошибке индекса массива)

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

DataRow[] dr = payments.dtPayments.Select(myselect);
List<DataRow> rowsToRemove = new List<DataRow>();

for (int a = 0; a < dr.Length; a++) {
    if(/* You want to delete this row */) {
        rowsToRemove.Add(dr[a]);
    }
}

foreach(var dr in rowsToRemove) {
    payments.dtPayments.Rows.Remove(dr);
}
4 голосов
/ 24 ноября 2008

Если dr.Length равно нулю, то ваш выбор не вернул ни одной строки. Если вы хотите удалить строки, которые не соответствуют вашим критериям, я бы реализовал это как запрос другого типа. Также может быть, что я совершенно не понимаю ваш вопрос. Не могли бы вы обновить свой вопрос, чтобы показать свой SQL и указать, где в примере кода у вас возникла проблема: внутри цикла или после цикла, где у вас есть комментарий?

2 голосов
/ 24 ноября 2008

Вам нужно создать datarow вне цикла, затем, когда вы доберетесь до строки, которую вы хотите удалить, назначьте ее строке, которую вы создали снаружи. и разорвать петлю. Затем под петлей вы можете удалить его.

DataRow r = null;
foreach(DataRow row in table.Rows)
{
   if(condition==true)
   {
      r = row;
      break;
   }
}

table.Rows.Remove(r);
1 голос
/ 24 ноября 2008

Вы можете перебрать коллекцию в обратном порядке (для (int i = rows.length-1; x> -1; x--)), чтобы удалить несколько строк, чтобы убедиться, что вы не получите индекс из-за связанных ошибок.

1 голос
/ 24 ноября 2008

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

payments.dtPayments.Rows.Remove (др)

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