2009-08-27 60 views
7

Necesitamos ayuda para solucionarlo.asp.net gridview checkbox selection

Tengo una vista de cuadrícula y dentro de la vista de cuadrícula tengo una casilla de verificación y después de hacer clic en la casilla de verificación, estoy haciendo un evento de devolución de datos y tratando de actualizar esta fila en particular solo en la base de datos.

Este es mi código de casilla de verificación gridview. ver el OnCheckedChanged.

<asp:TemplateField HeaderText="Sample"> 
    <ItemTemplate> 
    <asp:CheckBox runat="server" 
        ID="chkSample" 
        Checked='<%# Bind("Sample") %>' 
        OnCheckedChanged="UpdateSupplyLed" 
        AutoPostBack="True"> 
    </asp:CheckBox> 
    </ItemTemplate> 
</asp:TemplateField> 

Código:

protected void UpdateSupplyLed(object sender, EventArgs e) 
{ 
    foreach (GridViewRow di in SamplingGridView.Rows)  
    {   
     CheckBox chkBx = (CheckBox)di.FindControl("chkSample"); 
     if (chkBx != null && chkBx.Checked) 
     { 
      //update database logic here. 
     } 
    } 
} 

El código anterior funciona bien, pero me está recibiendo todas las casillas de verificación que se comprueban irresepective de la que acabo de comprobar. No los quiero a todos.

¿Cómo puedo obtener el único valor de una fila que se acaba de comprobar. Es posible que algunas de las filas ya se hayan verificado porque el estado es verdadero para esos registros y no quiero actualizar esos registros.

¡Creo que tengo mi pregunta correcta!

Actualización: La respuesta es:

protected void UpdateSupplyLed(object sender, EventArgs e) 
{ 
    CheckBox chkSampleStatus = sender as CheckBox;   
    bool sample = chkSampleStatus.Checked;    
    GridViewRow row = chkSampleStatus.NamingContainer as GridViewRow;   
    TextBox txtId = row.FindControl("Id") as TextBox;    
    int id = Int32.Parse(txtId.Text); 
} 

Respuesta

7

Prueba esto:

CheckBox chkBx = sender as CheckBox; 

En lugar de iterar todas las filas.

No he usado CheckBox en una GridView de esta manera. Usualmente usaría el evento OnRowCommand de GridView en su lugar y usaría el valor RowIndex o CommandArgument para actualizar la base de datos.

Pensar en ello OnRowcommand podría ser complicado para que una CheckBox se dispare, una mejor solución podría estar apegándose al evento CheckChanged de la casilla de verificación y navegar hasta el lado del servidor GridViewRow usando los controles NamingContainer. Algo así como:

GridViewRow row = chkBx.NamingContainer as GridViewRow; 

estoy suponiendo que el CheckBox va => Cell => fila si se busca en Google ASP.NET NamingContainer obtendrá algunos datos más específicos.

+0

Gracias por su respuesta. Pero necesito algunos otros valores de esa misma fila, así que ¿cómo puedo obtener el Id de la fila de esa fila de gridview en particular? para que pueda obtener Id del registro. – Supremestar

+0

Luego recomiendo no encuadernar OnCheckChanged de la casilla de verificación, usar el OnRowCommand de GridViews, la fila se suministra en GridVieweCommandEventArgs –

+0

HollyStyles, No tengo un campo de comando de selección en la vista Gridview para que el comando de la fila Gridview no se active. ¿Qué debería hacer mi amigo? Por favor ayuda. – Supremestar

0

Prueba esto también si anteriormente no funciona exactamente

DataTable dtGetStTable = (DataTable)ViewState["dtNewStudents"]; 

//Looping throgh Grid and deleting row after finding the checked row 
for (int i = dtGetStTable.Rows.Count - 1; i > -1; i--) 
{ 
GridViewRow row = GridView1.Rows[i]; 
bool isChecked = ((CheckBox)row.FindControl("CheckBox1")).Checked; 

if (isChecked) 
{ 
    try 
    { 
     string RollNo = dtGetStTable.Rows[i]["RollNo"].ToString(); 
     string Class = dtGetStTable.Rows[i]["Class"].ToString(); 
     string Division = dtGetStTable.Rows[i]["Division"].ToString(); 
     //Deleting the Reocrd from DataBase 
     TotalRecordDeleted += objSRE.DeleteTheSelectedRecord(RollNo, Class, Division); 

     dtGetStTable.Rows[i].Delete(); 
     dtGetStTable.AcceptChanges(); 
    } 
    catch (Exception ex) 
    { 

     //throw; 
    } 
} 

}