Mit dem ASP.NET Gridview-Steuerelement, wie kann ich deaktivieren Kontrollen oder einzelne Zellen in einem GridViewRow nach Pageindexchanged?

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

Frage

Ich habe ein Datum gebundenes Gridview-Steuerelement, in denen ich in der Lage bin zu deaktivieren einzelnen Zellen auf der Basis der Benutzerrolle. Dies funktioniert nur auf der ersten Seite.

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; 
        }
    }

ich diese Methode auf Page_Load nennen, wo es funktioniert. Ich habe es versucht, in den PageIndexChaging und Pageindexchanged Event-Handler, wo es nicht funktioniert. Während des Debuggens scheint es erfolgreich in beiden der Kontrollen in der Reihe auf falsch aktiviert einzustellen. Mein Ziel ist es, diese Felder, je nach Benutzerrolle zu deaktivieren, nachdem die Seite wechseln. Wie soll das erreicht werden?

War es hilfreich?

Lösung 2

Ich fand, dass dies in den RowDataBound Ereignishandler getan werden muss.

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
   }
}

Andere Tipps

Sie haben nicht zu durchlaufen alle Kontrollen zur Deaktivierung oder verbergen / sichtbar sie benötigen.

Jede Zelle in einem Gridview-Steuerelement ist eigentlich eine HTML-Tabelle Bezug, wenn gerendert (Blick auf den Code in Ihrer Seite mit FireFly oder Inspector).

Warum also nicht durchlaufen alle Zellen und alle Kontrollen in jeder Zelle gefunden, nur deaktivieren sie? Oder Sie können einfach Schleife durch jede Zeile Ihrer Gridview und deaktivieren oder verbergen sie direkt, was alles in der Reihe auswirken wird.

Ausblenden einer Tabellenzelle Referenzbeispiel mit:

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

So das wird disable alles Tabellenzelle durch Tabellenzelle.

oder .. warum nicht nur die gesamte Zeile deaktivieren?

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

Wenn Sie auf Pin-Point oder Filter bestimmte Steuerarten (CheckBox, TextBox, Etikett, usw.) und betreffen nur die Kontrollen dann einfach Test für sie!

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;
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top