Avec le contrôle ASP.NET GridView, comment puis-je désactiver le contrôle ou des cellules individuelles dans un GridViewRow après PageIndexChanged?

StackOverflow https://stackoverflow.com/questions/3963603

Question

J'ai un contrôle lié aux données GridView, dans lequel je suis en mesure de cellules individuelles désactiver en fonction du rôle de l'utilisateur. Cela ne fonctionne que sur la première page.

private void LimitAccessToGridFields()
    {
        if (User.IsInRole("Processing")) return;

        foreach (GridViewRow gridViewRow in gvScrubbed.Rows)
        {
            var checkBox = ((CheckBox) gridViewRow.FindControl("cbScrubbed"));
            checkBox.Enabled = false;

            // ButtonField does not have an ID to FindControl with
            // Must use hard-coded Cell index
            gridViewRow.Cells[1].Enabled = false; 
        }
    }

J'appelle cette méthode sur Page_Load, où il travaille. Je l'ai essayé dans les gestionnaires et PageIndexChaging événement PageIndexChanged, où il ne fonctionne pas. Lors du débogage, il semble correctement configuré Activé false dans les deux contrôles de la ligne. Mon but est de désactiver ces domaines, selon le rôle de l'utilisateur, après avoir modifié la page. Comment y parvenir?

Était-ce utile?

La solution 2

Je trouve que cela doit être fait dans le gestionnaire d'événements RowDataBound.

if (e.Row.RowType == DataControlRowType.DataRow)
{
   // details elided ...

   // Limits the access to grid fields.
   if (!User.IsInRole("PROCESSING"))
   {
       cbstuff.Enabled = false; // a checkbox
       e.Row.Cells[1].Enabled = false; //a link button
   }
}

Autres conseils

Vous n'avez pas besoin d'itérer par des contrôles pour désactiver ou cacher / visible les.

Chaque cellule dans un contrôle GridView est en fait une référence de tableau HTML, lors du rendu (regardez le code dans votre page en utilisant FireFly ou inspecteur).

Alors pourquoi ne pas itérer à travers toutes les cellules et tous les contrôles trouvés dans chaque cellule, il suffit de les désactiver? Ou vous pouvez faire une boucle sur chaque ligne de votre GridView et désactiver ou cacher directement, ce qui affectera tout à l'intérieur de la ligne.

masquage à l'aide d'un exemple de référence de la cellule de tableau:

foreach (GridViewRow gRow in myGridView.Rows)
            {
                if (gRow.RowType == DataControlRowType.DataRow)
                {
                        TableCellCollection tbcCol = (TableCellCollection)gRow.Cells;
                        foreach (TableCell tblCell in tbcCol)
                                tblCell.Enabled = false;
                }
            }

qui sera cellule de table tout disable par cellule du tableau.

OU .. pourquoi ne pas simplement désactiver toute la ligne?

foreach (GridViewRow gRow in myGridView.Rows)
            {
                if (gRow.RowType == DataControlRowType.DataRow)
                   gRow.Enable = false;
            }

Si vous avez besoin à la broche point ou filtrer les types de contrôle particulier (CheckBox, TextBox, étiquettes, etc.) et n'affectent les commandes alors simplement test pour eux!

foreach (GridViewRow gRow in myGridView.Rows)
{
  if (gRow.RowType == DataControlRowType.DataRow)
  {
     TableCellCollection tbcCol = (TableCellCollection)gRow.Cells;
     foreach (TableCell tblCell in tbcCol)
         if (((TextBox)tblCell) != null)
             ((TextBox)tblCell).Enable = false;
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top