Question

I ai une grille databound avec une colonne de champ sur matrice qui est une case à cocher. Lorsque l'utilisateur coche la case, il autopostback et mettre à jour la ligne pour indiquer vérification de la zone de l'état.

Ma première tentative a été d'utiliser simplement la méthode OnCheckedChanged, mais quand cela est appelé, je n'ai pas moyen de savoir quelle ligne la case à cocher est venue. Ainsi, je ne sais pas quelle ligne de mise à jour.

Quelqu'un peut-il proposer une méthode pour déterminer quelle ligne la case qui a déclenché l'événement oncheckedchanged est venu? Ou pouvez-vous suggérer une meilleure façon d'atteindre ce que je dois faire?

Je ne peux pas lier la case à la colonne de données parce que je ne veux pas la case à cocher désactivé en mode de sélection, et ne souhaite pas obliger l'utilisateur à entrer en mode édition pour modifier la valeur. Je dois aussi toutes les lignes pour être modifiable. Donc, la meilleure route semble être dans une colonne templated.

Était-ce utile?

La solution

Vous pourriez trouver la case cochée par itérer sur les lignes.

Protected Sub MyCheckBoxCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
    For Each row As GridViewRow In GridView1.Rows
        Dim cb As CheckBox = DirectCast(row.FindControl("MyCheckBoxID"), CheckBox)
        If sender Is cb AndAlso cb.Checked Then
            'Do something ...'
            Exit For
        End If
    Next
End Sub

Ce n'est pas aussi inefficace car il ressemble (quand est pas trop élevé PageSize de la grille).

Vous pouvez également obtenir le GridViewRow via Checkbox.Parent.Parent:

  Protected Sub MyCheckBoxCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
        Dim cb As CheckBox = DirectCast(sender, CheckBox)
        Dim row As GridViewRow = DirectCast(cb.Parent.Parent, GridViewRow)
        row.BackColor = DirectCast(IIf(cb.Checked, Color.Red, Color.White), Color)
  End Sub

est plus rapide que l'option 1 mais si vous F.E. Would nid la case située dans une table à l'avenir, cela ne fonctionne plus sans ajustement.

Je préfère normalement l'option 1, parce que dans un un gestionnaire d'événements milliseconde plus ou moins n'a pas d'importance.


Mise à jour : obtenir le GridViewRow via NamingContainer est un autre (à mon avis la meilleure) Option:

Dim row As GridViewRow = DirectCast(cb.NamingContainer, GridViewRow)

Cela fonctionne même encore quand vous imbriquez la case à l'intérieur d'autres contrôles comme un tableau.

Autres conseils

Je ne pense pas qu'il y ait une façon de le faire comme indiqué sans manipuler les RowEditing, RowUpdating et événements RowCancelingEdit.

Sinon, je vous suggère d'ajouter un CommandField au GridView, comme suit:

<asp:CommandField ShowSelectButton="true" />

Vous devrez gérer la GridView.SelectedIndexChanging, encore une fois comme ceci:

    void GridView_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
        GridView.SelectedIndex = e.NewSelectedIndex;
    }

Une fois que vous êtes dans SelectedIndexChanging, vous pouvez utiliser GridView.Rows[e.NewSelectedIndex].FindControl("id") pour obtenir le contrôle nécessaire -. Assumer cette funcitonality est toujours critique pour vous

Modifier Je viens de lire votre mise à jour, et je ne suis pas tout à fait sûr de ce que vous essayez d'atteindre ici. On dirait que vous êtes familier avec le CommandField. Que voulez-vous votre site Web pour faire lorsque vous cochez cette case qui doit être fait indépendamment les états de ligne?

Edit 2:. Vous pouvez également jeter object sender à votre CheckBox, et trouver le GridRow approprié à l'aide .Parent(), mais cela a toujours senti très hacky me

Edit 3:. Je vous jure, je vais arrêter l'édition de ce terme

Je ne l'ai jamais essayé, mais vous pouvez obtenir une référence à CheckBox.ClientID et essayer de passer par chaque ligne de la GridView, et appelant GridViewRow.FindControl(CheckBox.ClientID). Je ne sais vraiment pas si cela fonctionne, cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top