una toda seleccionar seleccionada por net marcar fila evento codigo boton asp c# asp.net gridview selectedindexchanged

c# - toda - ¿Cómo implementar la selección de fila completa en GridView sin seleccionar el botón?



seleccionar una fila de un datagridview c# (5)

Debe agregar esto en cada devolución y no solo en enlace de datos. Por lo tanto, debe usar el RowCreated RowCreated de GridView.

Por ejemplo

(DO#):

protected void GridView1_RowCreated(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Attributes["onmouseover"] = "this.style.cursor=''pointer'';this.style.textDecoration=''underline'';"; e.Row.Attributes["onmouseout"] = "this.style.textDecoration=''none'';"; e.Row.ToolTip = "Click to select row"; e.Row.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView1, "Select$" + e.Row.RowIndex); } }

(VB.Net):

Private Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated If e.Row.RowType = DataControlRowType.DataRow Then e.Row.Attributes("onmouseover") = "this.style.cursor=''pointer'';this.style.textDecoration=''underline'';" e.Row.Attributes("onmouseout") = "this.style.textDecoration=''none'';" e.Row.ToolTip = "Click to select row" e.Row.Attributes("onclick") = Me.Page.ClientScript.GetPostBackClientHyperlink(Me.GridView1, "Select$" & e.Row.RowIndex) End If End Sub

Estoy implementando una función que dice que cuando el usuario presiona sobre cualquier punto de la fila en un GridView, se seleccionará la fila en lugar del botón Seleccionar.

Para implementar eso, estoy usando el siguiente código:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { // Set the hand mouse cursor for the selected row. e.Row.Attributes.Add("OnMouseOver", "this.style.cursor = ''hand'';"); // The seelctButton exists for ensuring the selection functionality // and bind it with the appropriate event hanlder. LinkButton selectButton = new LinkButton() { CommandName = "Select", Text = e.Row.Cells[0].Text }; e.Row.Cells[0].Controls.Add(selectButton); e.Row.Attributes["OnClick"] = Page.ClientScript.GetPostBackClientHyperlink(selectButton, ""); } }

Con el código anterior, existen los siguientes problemas:

  • Esto funciona bien solo si EnableEventValidation para la página se establece en false .
  • El SelectedIndexChanged solo se Grid.DataBind() solo en caso de que se Grid.DataBind() en Page_Load para la página (en cada devolución de datos).

¿Estoy haciendo algo mal? ¿Hay una mejor implementación?

Editar: cuando EnableEventValidation se establece en true , aparecerá el siguiente error:

No válido postback o argumento de devolución de llamada. La validación de eventos se habilita mediante la configuración o <% @ Page EnableEventValidation = "true"%> en una página. Por motivos de seguridad, esta función verifica que los argumentos para la devolución de datos o los eventos de devolución de llamada se originan en el control del servidor que los generó originalmente. Si los datos son válidos y esperados, utilice el método ClientScriptManager.RegisterForEventValidation para registrar la devolución de datos o los datos de devolución de llamada para la validación.


En lugar de hacerlo en RowCreated , puedes hacerlo en Render() . De esta forma, podría usar la sobrecarga de GetPostBackClientHyperlink con true en registerForEventValidation y evitar el error " GetPostBackClientHyperlink no válido / devolución de llamada".

Algo como esto:

protected override void Render(HtmlTextWriter writer) { foreach (GridViewRow r in GridView1.Rows) { if (r.RowType == DataControlRowType.DataRow) { r.Attributes["onmouseover"] = "this.style.cursor=''pointer'';this.style.textDecoration=''underline'';"; r.Attributes["onmouseout"] = "this.style.textDecoration=''none'';"; r.ToolTip = "Click to select row"; r.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView1, "Select$" + r.RowIndex,true); } } base.Render(writer); }


Intenta usar <asp:LinkButton> alrededor de tu <tr> en código ASPX, establece el CommandName de LinkButton CommandName=''Select'' Y en el evento de comando de elemento, procesa este comando y configura el estilo de una fila seleccionada.


Pruebe esto agregar el evento OnSelectedIndexChanged en la grilla

OnSelectedIndexChanged="Grid_SelectedIndexChanged"

y luego en el código detrás

protected void Grid_SelectedIndexChanged(object sender, EventArgs e) { GridViewRow row = gvSummary.SelectedRow; //Int32 myvalue= Convert.ToInt32(row.Attributes["ColumnName"].ToString()); }

y establezca EnableViewState = "false", pero aquí tiene que realizar dos cosas más que ya ha hecho en su código significa establecer EnableEventValidation en falso y Grid Databinding en la página Cargar ...


<style type="text/css"> .hiddenColumn { display: none; } .rowGrid { cursor: pointer; } </style> <asp:GridView runat="server" ID="GridView1" AutoGenerateColumns="true" > <RowStyle CssClass="rowGrid" /> <Columns> <asp:CommandField ButtonType="Button" ShowSelectButton="true" HeaderStyle-CssClass="hiddenColumn" ItemStyle-CssClass="hiddenColumn" FooterStyle-CssClass="hiddenColumn" /> </Columns> </asp:GridView> <script type="text/javascript"> $(function () { $("#<%= GridView1.ClientID %> tr.rowGrid") .live("click", function (event) { $(this).find("input[type=''button''][value=''Select'']").click(); }); $("#<%= GridView1.ClientID %> input[type=''button''][value=''Select'']") .live("click", function (event) { event.stopPropagation(); }); }); </script>