Con il controllo ASP.NET GridView, come posso disattivare i controlli o cellule individuali in un GridViewRow dopo PageIndexChanged?

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

Domanda

Ho un GridView dati di controllo legato, in cui sono in grado di disattivare le singole celle in base al ruolo dell'utente. Questo funziona solo sulla prima pagina.

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

Io chiamo questo metodo su Page Load, in cui opera. Lo ho provato nel PageIndexChaging e gestori di eventi PageIndexChanged, dove non funziona. Durante il debug, sembra per impostare correttamente Enabled su false in entrambi i comandi nella riga. Il mio obiettivo è quello di disabilitare questi campi, a seconda del ruolo dell'utente, dopo la modifica della pagina. Come questo dovrebbe essere realizzato?

È stato utile?

Soluzione 2

Ho trovato che questo deve essere fatto nel gestore di eventi 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
   }
}

Altri suggerimenti

Non è necessario per scorrere tutti i controlli per disabilitare o nascondere / visibili.

Ogni cella in un controllo GridView è in realtà un riferimento tabella HTML, quando rese (sguardo al codice nella tua pagina utilizzando FireFly o Inspector).

E allora perché non iterata attraverso tutte le cellule, e qualsiasi controllo hanno trovato all'interno di ogni cellula, basta disabilitare loro? Oppure si può semplicemente scorrere ogni riga del GridView e disabilitare o nascondere direttamente, che interesserà tutto all'interno della riga.

nascondere utilizzando un esempio di riferimento cella di tabella:

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

Quindi, che consente di disattivare cella tutto da cellule tavolo.

O .. perché non basta disattivare l'intera riga?

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

Se avete bisogno di pin-point o di filtro particolare tipi di controllo (CheckBox, TextBox, Label, ecc) e riguardano solo quei controlli poi semplicemente prova per loro!

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;
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top