asp.net gridview checkbox readonly

Las columnas CheckBoxField en ASP.NET GridView están deshabilitadas, incluso si ReadOnly se establece en false



(2)

Tengo un GridView con dos columnas CheckBoxField. Ambos tienen la propiedad ReadOnly establecida en false, pero el código html generado para ellos tiene el atributo disabled = "disabled". Entonces el valor no puede ser cambiado.

Ejemplo HTML generado:

<span disabled="disabled"><input id="ctl00_ContentBody_GridView_ctl02_ctl01" type="checkbox" name="ctl00$ContentBody$GridView$ctl02$ctl01" checked="checked" disabled="disabled" /></span>

¿Alguien puede decir cómo resolverlo?


Esto es por diseño; las filas en un GridView no son editables por defecto.

Hay dos formas de abordar esto:

1. Agregue un enlace Editar

En su etiqueta GridView, agregue AutoGenerateEditButton="True" . Cuando su GridView se muestre en el navegador, ahora debería encontrar un hipervínculo con la etiqueta ''Editar''. Si hace clic en él, los campos en su GridView serán editables, y el enlace Editar se convertirá en dos enlaces, uno para guardar los cambios en la base de datos y el otro para descartarlos. Con este método, todas las tuberías para conectar los cambios en el GridView a la base de datos se pueden hacer por usted, dependiendo de cómo esté haciendo el enlace de datos. Este ejemplo usa un control SqlDataSource.
alt text http://philippursglove.com//checkboxgridview1.png alt text http://philippursglove.com//checkboxgridview2.png

2. Agregue un TemplateField con un CheckBox dentro de él

Dentro de la etiqueta <columns> , puede agregar TemplateFields que usted mismo configuró para la unión de datos, por ej.

<asp:TemplateField HeaderText="Discontinued"> <ItemTemplate> <asp:CheckBox runat="server" ID="DiscontinuedCheckBox" Checked=''<%# Eval("Discontinued") %>'' AutoPostback="true" OnCheckedChanged="DiscontinuedCheckBox_CheckedChanged" /> </ItemTemplate> </asp:TemplateField>

texto alternativo http://philippursglove.com//checkboxgridview3.png

Esta casilla de verificación estará habilitada, pero usted debe hacer el trabajo usted mismo para reflejar cualquier cambio en la base de datos. Esto es sencillo siempre que pueda obtener una clave de base de datos, ya que necesitará ejecutar una instrucción UPDATE en algún momento y desea ejecutarla en la fila correcta. Aquí hay dos formas en que podrías hacer esto:

En su etiqueta Gridview, agregue DataKeyNames="MyDatabasePrimaryKey" . Luego, en su CheckedChanged eventos CheckedChanged , debe averiguar en qué fila se encuentra y buscar en la matriz de DataKeys .

protected void DiscontinuedCheckBox_CheckedChanged(object sender, EventArgs e) { CheckBox DiscontinuedCheckBox; SqlConnection conn; SqlCommand cmd; int productId; GridViewRow selectedRow; // Cast the sender object to a CheckBox DiscontinuedCheckBox = (CheckBox)sender; // We can find the row we clicked the checkbox in by walking up the control tree selectedRow = (GridViewRow)DiscontinuedCheckBox.Parent.Parent; // GridViewRow has a DataItemIndex property which we can use to look up the DataKeys array productId = (int)ProductGridView.DataKeys[selectedRow.DataItemIndex].Value; using (conn = new SqlConnection(ProductDataSource.ConnectionString)) { cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; if (DiscontinuedCheckBox.Checked) { cmd.CommandText = "UPDATE Products SET Discontinued = 1 WHERE ProductId = " + ProductId.ToString(); } else { cmd.CommandText = "UPDATE Products SET Discontinued = 0 WHERE ProductId = " + ProductId.ToString(); } conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); } }

O bien, puede agregar la clave en un control de HiddenField:

<asp:TemplateField HeaderText="Discontinued"> <ItemTemplate> <asp:hiddenfield runat="server" id="ProductIdHiddenField" Value=''<%# Eval("ProductID") %>'' /> <asp:CheckBox runat="server" ID="DiscontinuedCheckBox" Checked=''<%# Eval("Discontinued") %>'' AutoPostback="true" OnCheckedChanged="DiscontinuedCheckBox_CheckedChanged" /> </ItemTemplate> </asp:TemplateField>

Código:

protected void DiscontinuedCheckBox_CheckedChanged(object sender, EventArgs e) { CheckBox DiscontinuedCheckBox; HiddenField ProductIdHiddenField; DiscontinuedCheckBox = (CheckBox)sender; ProductIdHiddenField = (HiddenField)DiscontinuedCheckBox.Parent.FindControl("ProductIdHiddenField"); using (conn = new SqlConnection(ProductDataSource.ConnectionString)) { ... if (DiscontinuedCheckBox.Checked) { cmd.CommandText = "UPDATE Products SET Discontinued = 1 WHERE ProductId = " + ProductIdHiddenField.Value; } ... }


La solución PhilPursglove funciona para mí (incluso en una grivview anidada). ¡Gracias!

Mi código completo (modificado para obtener también Grivview usando el árbol de control, porque no puedo acceder directamente a la vista de cuadrícula más nueva debido a la creación dinámica):

protected void Cb_IsApprovedByManagement_CheckChanged(object sender, EventArgs e) { CheckBox cb = (CheckBox)sender; // find the row we clicked the checkbox in by walking up the control tree GridViewRow selectedRow = (GridViewRow)cb.Parent.Parent; GridView gridView = (GridView)selectedRow.Parent.Parent; // look up the DataKeys array int QuestionID_Current = (int)gridView.DataKeys[selectedRow.DataItemIndex].Value; // change value QuestionManager.ToggleActivity(QuestionManager.GetQuestion(QuestionID_Current));