J'utilise ce code pour cast
mon DataGridView
, puis j'affiche les résultats dans un autre fichier DataGridView
.
Fondamentalement, j'obtiens des valeurs int et je calcule leur somme, tout en regroupant ces valeurs avec GroupBy
.
J'affiche les résultats dans un autre DataGridView
comme ceci :
datagridview2.DataSource= Su.ToList();
Mon problème est que la requête semble s'arrêter si la cellule a une valeur de chaîne.
J'ai essayé d'ajouter une where
condition « pas » pour exclure les lignes qui contiennent des valeurs de chaîne de plusieurs manières différentes, mais j'ai échoué.
Voici un exemple de la condition que j'ai essayé:
.Where(row => !row.Cells[2].Value.ToString().Equals("example"))
Ce code est dans la datagridview_cellvaluechanged
méthode :
try
{
var Su = dataGridView1.Rows.Cast<DataGridViewRow>()
.Where(row => row.Cells[8].Value != null)
.Where(row => row.Cells[2].Value != null)
.GroupBy(row => row.Cells[8].Value.ToString())
.Select(g => new
{
Gruppo = g.Key,
Serie = g.Sum(row => Convert.ToInt32(row.Cells[2].Value)),
Reps = g.Sum(row => Convert.ToInt32(row.Cells[3].Value) * Convert.ToInt32(row.Cells[2].Value)),
Percent = (g.Sum(row => Convert.ToDecimal(row.Cells[2].Value)) / Convert.ToDecimal(label15.Text)) * 100
});
}
catch (FormatException)
{
//MessageBox.Show("Formato non corretto");
}
Voici à quoi devrait ressembler le DataGridView, s'il réussit ; dgv1 :
column 1 | column 2 |column 3
2 3 group1
3 5 group1
4 6 group2
3 4 group3
Et je vois ceci dans le résultat sur dgv2 :
column 1 | column 2 |column 3
5 8 group1
4 6 group2
3 4 group3
Mais si j'ajoute une valeur de chaîne dans column2 comme ceci :
column 1 | column 2 |column 3
2 3 group1
3 5 group1
4 string group2
3 4 group3
Ensuite, je vois ceci dans le résultat sur dgv2 :
column 1 | column 2 |column 3
5 8 group1
Bien que je ne sois toujours pas tout à fait sûr de la nature du problème, je vais essayer de répondre à votre question.
Tout d'abord, si vous n'êtes pas sûr à 100% qu'une cellule spécifique contient une valeur Int, vous ne devez pas simplement la convertir aveuglément.
Il existe des moyens de vérifier s'il s'agit d'un int avant de le convertir. Une façon est la suivante :
try
{
var Su = dataGridView1.Rows.Cast<DataGridViewRow>()
.Where(row => row.Cells[8].Value != null)
.Where(row => row.Cells[2].Value != null)
.GroupBy(row => row.Cells[8].Value.ToString())
.Select(g => new
{
Gruppo = g.Key,
Serie = g.Sum(row => {
if(row.Cells[2].Value is int rowInteger)
return rowInteger;
// if it is not an integer then try to convert
// return a default value (in this case -1) if it can't be converted
else
{
try
{
return Convert.ToInt32(row)
}
catch(Exception)
{
return -1;
}
}
},
Reps = g.Sum(row => Convert.ToInt32(row.Cells[3].Value) * Convert.ToInt32(row.Cells[2].Value)),
Percent = (g.Sum(row => Convert.ToDecimal(row.Cells[2].Value)) / Convert.ToDecimal(label15.Text)) * 100
});
}
catch (FormatException)
{
//MessageBox.Show("Formato non corretto");
}
Cela garantira que toutes les lignes sont conservées, mais que seules les lignes valides sont calculées.
Une approche plus simple, qui ne conservera pas le nombre de lignes d'origine, consiste à vérifier si la valeur de la cellule est un entier ou peut être convertie en un entier consiste à ajouter l' Where
instruction suivante :
Where(row => row.Cells[2].Value is int || int.TryParse((row.Cells[2].Value as string), out var result))
Notez que vous analysez en fait la valeur à chaque itération et supprimez le résultat, c'est bien sûr loin d'être optimisé mais vous obtiendrez le résultat souhaité.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots