2008-11-24 3 views
7

Я заполнил Datatable с двух разных серверов. Я могу внести корректировки, когда моя длина> 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 
    }       
} 

ответ

4

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

+0

Вы правы. Я понимаю, что я не возвращаю никаких строк. То, что я сделал, это создать новый набор данных и заполнить строки тем, что я нашел. Спасибо – 2008-11-24 19:48:57

1

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

payments.dtPayments.Rows.Remove (д-р)

+0

Я сделал, и я посмотрел в нее больше. У меня был dr [0] .delete, у меня было то, что вы предложили (оба dr и dr [0]), а индекс ошибки был за пределами массива - это моя ошибка. Есть ли способ исправить это? – 2008-11-24 18:22:06

18

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

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

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); 
} 
+0

Ты гений! – 2012-10-09 11:58:04

2

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

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

table.Rows.Remove(r); 
1

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

+0

Мне это нравится намного лучше, чем двойной цикл. Это всегда мой предпочтительный метод. – Richard 2012-12-17 15:35:17

Смежные вопросы