Como Remover Com Segurança O DataRow No ForEach
-
22-09-2019 - |
Pergunta
Eu não entendo por que esse código não funciona.
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
Solução
Apesar de DataRow.Delete
não modifica o estado da coleção, A documentação da Microsoft indica que você não deve chamá-lo embora iterar sobre a coleção:
Nem Apagar, nem Remova deve ser chamado em um loop foreach enquanto iterar por meio de um objeto DataRowCollection.Excluir nem Remover modificar o estado da coleção.
A melhor solução é, geralmente, para criar uma coleção separada (por exemplo,um List<DataRow>
) de itens que você deseja remover e, em seguida, removê-los depois de terminar a iteração.
Esta é também a solução para situações em que você deseja remover itens de uma coleção, como a maioria das coleções .NET não permite que você altere o conteúdo da coleção, enquanto você está iterando sobre ele.
Outras dicas
Maneira mais segura de usar for
loop
for (int i = datatable.Rows.Count - 1; i >= 0; i--)
{
if (true)
{
datatable.Rows[i].Delete();
}
}
Não se esqueça de AcceptChanges
para remover todas as linhas marcadas:
datatable.AcceptChanges();
Você não pode modificar uma coleção enquanto está iterar, usando um foreach
declaração.
Você pode tentar algo assim:
List<DataRow> deletedRows = new List<DataRow>();
foreach (DataRow dataRow in dataTable.Rows)
{
if(true) deletedRows.Add(dataRow);
}
foreach(DataRow dataRow in deletedRows)
{
dataRow.Delete();
}
Se você ligar para o método de exclusão, só precisará ligar AcceptChanges()
Na mesa, você está modificando, após o loop foreach.
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
dataTable.AcceptChanges();
O método de exclusão simplesmente marca a linha para exclusão.
http://msdn.microsoft.com/en-us/library/system.data.datarow.delete%28v=vs.90%29.aspx
Você definiu seu arquivo hbm.xml para ser recurso incorporado?
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
dataTable.AcceptChanges();
Por favor, consulte os snaps para que o trabalho dele.
- Apenas excluído, mas não removido do DataTable.
- Ponto de quebra antes da função aceitchanges ().
- Após a função de aceitação de aceitação ().
Espero que este problema tenha resolvido agora.
Sim, libpng funciona em arquiteturas de 64 bits, incluindo x86_64.
É uma biblioteca de código aberto para que você possa compilá-lo com seu projeto se um binário pré-compilado não estiver disponível para sua plataforma / arquitetura.
A maneira mais fácil de conseguir isso usando uma lista para mapear linhas que você deseja excluir e excluir linhas fora da iteração DataTable.
C#
List<DataRow> rowsWantToDelete= new List<DataRow>();
foreach (DataRow dr in dt.Rows)
{
if(/*Your condition*/)
{
rowsWantToDelete.Add(dr);
}
}
foreach(DataRow dr in rowsWantToDelete)
{
dt.Rows.Remove(dr);
}
Vb
Dim rowsWantToDelete As New List(Of DataRow)
For Each dr As DataRow In dt
If 'Your condition' Then
rowsWantToDelete .Add(dr)
End If
Next
For Each dr As DataRow In rowsWantToDelete
dt.Rows.Remove(dr)
Next
Há uma outra versão do mesmo ("eu acho que o mais fácil) o que eu usei:
int i=0;
while (i < myDataTable.Rows.Count)
{
if (condition) //should it be deleted?
myDataTable.Rows.RemoveAt(i);
else
i++;
}
Isto é mais rápido.
Somente para pessoas que procuram cenário específico como eu, eu precisava diminuir o tempo gasto e, uma vez que alguma informação útil é extraída de cada linha, excluí a linha marcando como excluído.
Espero que isso ajude alguém ...
foreach (DataRow dataRow in dataTable.Rows)
{
if (dataRow.RowState != DataRowState.Deleted)
{
if (your condition here)
{
dataRow.Delete();
}
}
}
Isso se aplica a praticamente qualquer coleção. Se você tentar excluir um item enquanto estiver na coleção, terá um problema. Por exemplo, se você excluir a linha nº 3, a linha anterior nº 4 se tornará a linha 3.
Configurações do site goto, em look e sinta-se selecione Rendições de imagem.
Aqui você pode mexer ao redor para escolher o que você deseja mostrar com uma imagem quando o SharePoint processa a imagem do perfil.
é encontrado aqui:
Selecione a imagem (miniatura) pairando e clique em Editar Renditions
Estes são os tamanhos para mudar para o seu gosto:
Clique no tamanho selecionado para editar (escala está disponível)
Agora selecione sua renderização que você deseja como padrão
Infelizmente, uma vez que a renderização começou, não pode ser salvo. O que eu quero dizer é quando você carregar uma imagem para sharpeoint, ele economiza três escalas e aquelas que são salvas e usadas ... A imagem original não é salva. Então, se salvou as imagens cortadas do que ela usará as imagens recortadas. Você precisaria reuplicar a imagem de outra forma!
Detalhes completos podem ser encontrados aqui:
Use isto:
for (int i = 0; i < myDataTable.Rows.Count; i++)
{
myDataTable[i].Delete();
}
Isso ocorre porque parece tentar desmontar a escada da escada em que você escala. Simplesmente, você não pode remover um item que você itera.
Portanto, você deve usar uma matriz diferente para iterar e removê -los de Datatable Rows
propriedade.
foreach (DataRow dataRow in dataTable.Select())
{
if (true)
{
dataTable.Rows.Remove(dataRow);
}
}
A Certeza De Magents
Esta é a forma como eu fiz isso e funciona bem
dt = GetStationeryConsolidationDetails(txtRefNo.Text);
int intRows = dt.Rows.Count;
int x = 0;
for (int c = 0; c < intRows; c++)
{
if (dt.Rows[c - x]["DQTY"].ToString() == "0")
{
dt.Rows[c - x].Delete();
dt.AcceptChanges();
x++;
}
}