Obtention de la valeur d’une cellule à partir d’un gridview sur un événement RowDataBound

ssortingng percentage = e.Row.Cells[7].Text; 

J’essaie de créer du contenu dynamic avec GridView. J’ai donc câblé du code à l’événement RowDataBound. J’essaie d’obtenir la valeur d’une cellule particulière, qui est un TemplateField. Mais le code ci-dessus semble toujours renvoyer une chaîne vide.

Des idées?

Pour clarifier, voici un peu la cellule incriminée:

      

Sur une note connexe, quelqu’un sait-il s’il existe un meilleur moyen de sélectionner la cellule dans la rangée? Ça craint de mettre en cell[1] . Est-ce que je ne peux pas faire cell["mycellname"] , donc si je décide de changer l’ordre de mes cellules, les bugs n’apparaîtront pas?

Tout d’abord, vous devez insérer votre code dans un contrôle Label ou Literal afin de pouvoir le référencer correctement. Ce qui se passe, c’est qu’il n’y a aucun moyen pour le système de garder trace de cela, car aucun contrôle n’est associé au texte. Il incombe au contrôle d’append son contenu à viewstate.

Vous devez utiliser gridView.FindControl (“controlName”); pour obtenir le contrôle dans la rangée. De là, vous pouvez accéder à ses propriétés, y compris le Text .

Vous pouvez également accéder à la propriété DataItem de la ligne en question, lui atsortingbuer le type approprié et extraire directement les informations.

pourquoi ne pas extraire les données directement de la source de données.

 DataBinder.Eval(e.Row.DataItem, "ColumnName") 

Lorsque vous utilisez un TemplateField et y attachez du texte littéral comme vous le faites, asp.net insérera un contrôle POUR VOUS! Il est mis dans un DataBoundLiteralControl. Vous pouvez le voir si vous regardez dans le débogueur à proximité de votre ligne de code contenant le texte vide.

Ainsi, pour accéder aux informations sans changer votre modèle pour utiliser un contrôle, vous pouvez lancer comme ceci:

 ssortingng percentage = ((DataBoundLiteralControl)e.Row.Cells[7].Controls[0]).Text; 

Cela vous donnera votre texte!

Les suggestions ci-dessus sont de bonnes suggestions, mais vous pouvez obtenir la valeur de texte d’une cellule dans une vue de grid sans l’envelopper dans un contrôle littéral ou une étiquette. Vous devez juste savoir quel événement connecter. Dans ce cas, utilisez plutôt l’événement DataBound, comme suit:

 protected void GridView1_DataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { if (e.Row.Cells[0].Text.Contains("sometext")) { e.Row.Cells[0].Font.Bold = true; } } } 

Lorsque vous exécutez un débogueur, vous verrez le texte apparaître dans cette méthode.

Utilisez simplement une boucle pour vérifier votre cellule dans un gridview, par exemple:

 for (int i = 0; i < GridView2.Rows.Count; i++) { string vr; vr = GridView2.Rows[i].Cells[4].Text; // here you go vr = the value of the cel if (vr == "0") // you can check for anything { GridView2.Rows[i].Cells[4].Text = "Done"; // you can format this cell } } 

utilisez la fonction RowDataBound pour lier des données à une cellule spécifique et pour obtenir l’utilisation du contrôle (nom de contrôle ASP tel que DropDownList) GridView.FindControl("Name of Control")

J’avais une question similaire, mais j’ai trouvé la solution en adoptant une approche légèrement différente. Au lieu de rechercher le contrôle comme suggéré par Chris, j’ai d’abord modifié la manière dont le champ a été spécifié dans la page .aspx. Au lieu d’utiliser une , j’ai modifié le champ en question pour utiliser . Ensuite, lorsque je suis arrivé à l’événement RowDataBound, les données étaient directement accessibles dans la cellule.

Les fragments pertinents: Premièrement, la page aspx:

  ...Other fields...  ...  

Ensuite, dans l’événement RowDataBound, je peux accéder directement aux valeurs:

 protected void gvVarianceReport_Sorting(object sender, GridViewSortEventArgs e) { if (e.Row.Cells[2].Text == "0") { e.Row.Cells[2].Text = "N/A"; e.Row.Cells[3].Text = "N/A"; e.Row.Cells[4].Text = "N/A"; } } 

Si quelqu’un pouvait dire pourquoi cela fonctionne, je l’apprécierais. Je ne comprends pas bien pourquoi, sans BoundField, la valeur ne se trouve pas dans la cellule après la liaison, mais vous devez la rechercher via le contrôle.

 Label lblSecret = ((Label)e.Row.FindControl("lblSecret")); 
   <%# AddPercentClickThroughs(Convert.ToDecimal(DataBinder.Eval(Container.DataItem, "EmailSummary.pLinksClicked")), Convert.ToDecimal(DataBinder.Eval(Container.DataItem, "NumberOfSends")))%>   public ssortingng AddPercentClickThroughs(decimal NumberOfSends, decimal EmailSummary.pLinksClicked) { decimal OccupancyPercentage = 0; if (TotalNoOfRooms != 0 && RoomsOccupied != 0) { OccupancyPercentage = (Convert.ToDecimal(NumberOfSends) / Convert.ToDecimal(EmailSummary.pLinksClicked) * 100); } return OccupancyPercentage.ToSsortingng("F"); } 

Si vous définissez l’atsortingbut Visible sur asp: BoundField sur False . Comme ça

  

Vous n’obtiendrez aucun texte dans la propriété Cells [i] .Text lorsque vous bouclez les lignes. Alors

 foreach (GridViewRow row in myGrid.Rows) { userList.Add(row.Cells[0].Text); //this will be empty "" } 

Mais vous pouvez définir une colonne non visible en connectant la grid à l’événement OnRowDataBound, à partir de là, procédez comme suit.

 e.Row.Cells[0].Visible = false //now the cell has Text but it's hidden 
 protected void gvbind_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Atsortingbutes["onmouseover"] = "this.style.cursor='hand';"; e.Row.Atsortingbutes["onmouseout"] = "this.style.textDecoration='none';"; e.Row.Atsortingbutes["onclick"] = ClientScript.GetPostBackClientHyperlink(this.gvbind, "Select$" + e.Row.RowIndex); } }