2011-08-31 6 views
5

Desidero duplicare la stessa funzionalità del pulsante di modifica utilizzando un singolo clic in qualsiasi punto della riga GridView.Fare clic in qualsiasi punto della riga GridView per accedere alla modalità di modifica

Il seguente codice fa questo, ma con un grave problema: se l'utente clicca off di una casella di testo al successivo, il comando di modifica incendi nuovamente, e le modifiche apportate al testo precedente tornare indietro al suo valore originale .

Qualche suggerimento su come risolvere questo comportamento?

Oppure, c'è un approccio migliore per realizzare questo?

MODIFICA: È stato risolto aggiungendo un assegno per row.RowState.HasFlag(DataControlRowState.Edit). Vedere codice qui sotto:

protected override void Render(System.Web.UI.HtmlTextWriter writer) 
{ 
    foreach(GridViewRow row in gvwOrderItems.Rows) 
    { 
     if(row.RowType == DataControlRowType.DataRow && 
      row.RowState.HasFlag(DataControlRowState.Edit) == false) 
     { 
      // enable click on row to enter edit mode 
      row.Attributes["onclick"] = 
       ClientScript.GetPostBackClientHyperlink(gvwOrderItems, "Edit$" + row.DataItemIndex, true); 
     } 
    } 
    base.Render(writer); 
} 
+0

ho aggiunto questo codice al mio gestore RowDataBound, e quindi invece di usare row.DataItemIndex come il 2 ° parametro, ho usato gv.DataKeys (e.Row.RowIndex) .Value ho poi prendere l'evento nel RowEditing evento e e.NewEditIndex è l'ID del mio oggetto piuttosto che l'indice di riga. – yougotiger

risposta

6

Controllare row.RowState.HasFlag(DataControlRowState.Edit).

protected override void Render(System.Web.UI.HtmlTextWriter writer) 
{ 
    foreach(GridViewRow row in gvwOrderItems.Rows) 
    { 
     if(row.RowType == DataControlRowType.DataRow && 
      row.RowState.HasFlag(DataControlRowState.Edit) == false) 
     { 
      // enable click on row to enter edit mode 
      row.Attributes["onclick"] = 
       ClientScript.GetPostBackClientHyperlink(gvwOrderItems, "Edit$" + row.DataItemIndex, true); 
     } 
    } 
    base.Render(writer); 
} 
+0

Grazie, ho visitato un sacco di siti per giorni in cui il codice era incompleto o non funzionava. Questo è simile a quello di cui avevo bisogno, ottimo esempio! – codeape

+0

Ho reso la riga di gridview modificabile all'evento click e poi come salvare dopo aver eseguito la modifica ... –

+0

@ jim31415 ho bisogno della stessa funzionalità sul mio progetto ma sto ricevendo il seguente errore sotto hasflag che dice: Errore 8 \t ' System.Web.UI.WebControls.DataControlRowState 'non contiene una definizione per' HasFlag 'e nessun metodo di estensione' HasFlag 'che accetta un primo argomento di tipo' System.Web.UI.WebControls.DataControlRowState 'potrebbe essere trovato (mancate una direttiva using o un riferimento all'assembly?) hai affrontato questo problema ?? – HackMaster

0

Non ho prove questo come io non uso GridView, ma lo faccio con altri controlli. Si dovrebbe essere in grado di mettere pulsante nascosto nella riga e chiamare Click sulla riga tramite JavaScript:

protected override void Render(System.Web.UI.HtmlTextWriter writer) 
{ 
    foreach(GridViewRow row in gvwOrderItems.Rows) 
    { 
     if(row.RowType == DataControlRowType.DataRow) 
     { 
      Button b = new Button(); 
      b.ID = "whatever"; 
      b.CommandName = "edit"; 
      b.Attributes.Add("style","display:none;") 
      row.Controls.Add(b); 
      // enable click on row to enter edit mode 
      row.Attributes.Add("onclick" ,"document.getElementById('" bla.ClientID "').click();"); 
     } 
    } 
    base.Render(writer); 
} 
+0

Grazie per la risposta, farò un tentativo. – jim31415

+0

Ho lo stesso comportamento. Una volta nella modalità di modifica, facendo clic in una casella di testo si attiva nuovamente il comando di modifica. – jim31415