2017-10-09 4 views
0

Je suis en train de coder comme ci-dessous mais cela fonctionne incorrectement. Il effectue (plus et supprime) seulement 2 à 3 lignes si les données ont 5 à 6 données dupliquées.Vérifiez les doublons et les valeurs de sum dans datagridview C#

Mise à jour et il fonctionne

for (int i = 0; i < dataGridView1.RowCount - 1; i++) //compare data 
     { 
      var Row = dataGridView1.Rows[i]; 
      string abc = Row.Cells[1].Value.ToString() + Row.Cells[2].Value.ToString().ToUpper(); 
      // MessageBox.Show(abc); 
      for (int j = i + 1; j < dataGridView1.RowCount; j++) 
      { 
       var Row2 = dataGridView1.Rows[j]; 
       string def = Row2.Cells[1].Value.ToString() + Row2.Cells[2].Value.ToString().ToUpper(); 
       if (abc == def) 
       { 
        Row.Cells[5].Value = Convert.ToDouble(Row.Cells[5].Value.ToString()) + Convert.ToDouble(Row2.Cells[5].Value.ToString()); 
        dataGridView1.Rows.Remove(Row2); 
        j--; 

       } 
      } 
     } 

enter image description here

Répondre

1

Cela devrait faire l'affaire pour vous:

for (int i = 0; i < dataGridView1.RowCount - 1; i++) //compare data 
{ 
    var Row = dataGridView1.Rows[i]; 
    string abc = Row.Cells[0].Value.ToString() + Row.Cells[1].Value.ToString().ToUpper(); 

    for (int j = i+1; j < dataGridView1.RowCount; j++) 
    { 
     var Row2 = dataGridView1.Rows[j]; 
     string def = Row2.Cells[0].Value.ToString() + Row2.Cells[1].Value.ToString().ToUpper(); 
     if (abc == def) 
     { 
     Row.Cells[2].Value = (int)Row.Cells[2].Value + (int)Row2.Cells[2].Value; 
     dataGridView1.Rows.Remove(Row2); 
     j--; 
     } 
    } 
} 

Vous devez essentiellement de garder une trace de j variable vous supprimer des lignes de la collection.

Si vous êtes un fan de LINQ et ne me dérange pas un peu d'un code alambiqué, voici une autre approche:

for (int i = 0; i < dataGridView1.RowCount; i++) //compare data 
{ 
    var R = dataGridView1.Rows[i]; 
    var V = R.Cells[0].Value.ToString() + R.Cells[1].Value.ToString().ToUpper(); 
    var DupRows = dataGridView1.Rows.Cast<DataGridViewRow>().Skip(i + 1). 
        Where(r => r.Cells[0].Value.ToString() + r.Cells[1].Value.ToString().ToUpper() == V); 
    R.Cells[2].Value = (int)R.Cells[2].Value + DupRows.Sum(r => (int)r.Cells[2].Value); 

    foreach (var DupRow in DupRows) 
     DupRow.Tag = "Del"; 
} 

for (int i = 0; i < dataGridView1.RowCount; i++) 
{ 
    var R = dataGridView1.Rows[i]; 
    if (R.Tag?.ToString() == "Del") 
    { 
     dataGridView1.Rows.Remove(R); 
     i--; 
    } 
} 

En tant que conseil, ce genre de choses est traitée beaucoup plus facilement dans le back-end. Quel que soit votre DataGridView est lié à, soit un DataTable ou une collection générique, vous devez implémenter la suppression de doublons là au lieu de jouer directement avec DataGridView cellules.

+0

cela fonctionne mais je dois cliquer sur le bouton de gestion plusieurs fois. Si vous cliquez une fois, les activités ressemblent à mon code. – gggg

+0

@gggg: Lequel, simple ou version LINQ? – dotNET

+0

J'ai utilisé une version simple. – gggg