2011-08-31 29 views
5

Quiero duplicar la misma funcionalidad del botón editar con un solo clic en cualquier lugar de una fila de GridView.Haga clic en cualquier lugar en una fila de GridView para ingresar al modo de edición

El código siguiente hace esto, pero con un problema importante: si el usuario hace clic fuera de un cuadro de texto a la siguiente, los fuegos de edición de comandos de nuevo, y los cambios realizados en el cuadro de texto anterior revertir de nuevo a su valor original .

¿Alguna sugerencia para solucionar este problema?

¿O hay un mejor enfoque para lograr esto?

EDITAR: Esto se resolvió agregando un cheque para row.RowState.HasFlag(DataControlRowState.Edit). Ver código de abajo:

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

he añadido el código a mi manejador RowDataBound, y luego en lugar de utilizar row.DataItemIndex como el segundo parámetro, solía gv.DataKeys (e.Row.RowIndex) .Value luego cojo el evento en el RowEditing evento y e.NewEditIndex es el ID de mi artículo en lugar del índice de la fila. – yougotiger

Respuesta

6

Comprobar si 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

Gracias, he estado revisando un montón de sitios durante días donde el código estaba incompleto o no funcionaba. Esto es similar a lo que necesitaba, ¡gran ejemplo! – codeape

+0

He hecho que la fila gridview sea editable en click y luego cómo guardar después de ejecutar edit ... –

+0

@ jim31415 Necesito la misma funcionalidad en mi proyecto pero obtengo el siguiente error bajo hasflag dice: Error 8 \t ' System.Web.UI.WebControls.DataControlRowState 'no contiene una definición para' HasFlag 'y no se pudo encontrar ningún método de extensión' HasFlag 'que aceptara un primer argumento de tipo' System.Web.UI.WebControls.DataControlRowState '(¿falta? una directiva de uso o una referencia de ensamblado?) ¿Enfrentaste este problema? – HackMaster

0

No he probado esto como yo no uso GridView, pero lo hago con otros controles. Usted debe ser capaz de poner el botón oculto en la fila y llamar a Click en la fila a través de 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

Gracias por la respuesta, lo intentaré. – jim31415

+0

Obtengo el mismo comportamiento. Una vez en el modo de edición, al hacer clic en un cuadro de texto, se vuelve a activar el comando de edición. – jim31415

Cuestiones relacionadas