2009-08-27 19 views
7

Brauchen Sie Hilfe, um dies zu lösen.asp.net gridview Kontrollkästchen Auswahl

Ich habe eine Gridview und innerhalb der Gridview habe ich ein Kontrollkästchen und nach dem Klicken auf das Kontrollkästchen, ich mache ein Postback-Ereignis und versuchen, diese bestimmte Zeile nur auf der Datenbank zu aktualisieren.

Dies ist meine gridview checkbox code. siehe OnCheckedChanged.

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

Code:

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. 
     } 
    } 
} 

Der obige Code funktioniert gut, aber es wird immer mir alle Kontrollkästchen, die irresepective des einen geprüft werden, die ich gerade überprüft. Ich will nicht alle.

Wie kann ich den einzigen Zeilenwert erhalten, der gerade geprüft wurde? Einige der Zeilen wurden möglicherweise bereits überprüft, da der Status für diese Datensätze wahr ist und ich diese Datensätze nicht aktualisieren möchte.

Ich denke, ich habe meine Frage richtig gemacht!

Update: Die Antwort lautet:

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); 
} 

Antwort

7

Try this:

CheckBox chkBx = sender as CheckBox; 

Anstatt laufen alle Zeilen.

Ich habe CheckBox's in einer GridView auf diese Weise selbst nicht benutzt. Normalerweise verwende ich stattdessen das OnRowCommand-Ereignis von GridView und verwende den RowIndex- oder CommandArgument-Wert, um die Datenbank zu aktualisieren.

Wenn Sie darüber nachdenken OnRowcommand könnte schwierig sein, wenn eine CheckBox ausgelöst wird, eine bessere Lösung könnte mit dem CheckChanged-Ereignis des Kontrollkästchens bestehen und mit den Steuerelementen NamingContainer zur GridViewRow-Serverseite navigieren. Etwas wie:

GridViewRow row = chkBx.NamingContainer as GridViewRow; 

Ich gehe davon aus das CheckBox => Zelle = geht> Zeile, wenn Sie Google ASP.NET NamingContainer Sie einige weitere Besonderheiten bekommen.

+0

Dank für Ihre Antwort danken. Aber ich brauche ein paar andere Werte aus derselben Zeile. Wie kann ich also die Zeilen-ID dieser bestimmten Gridview-Zeile erhalten? damit ich von der Aufzeichnung erfahren kann. – Supremestar

+0

Dann empfehle ich, die Checkbox OnCheckChanged nicht zu binden, stattdessen die GridViews OnRowCommand, die Zeile wird in der GridVieweCommandEventArgs –

+0

HollyStyles, Ich habe kein Auswahlbefehlsfeld in der Gridview so Gridview Zeile Befehl wird nicht ausgelöst. Was soll ich mit meinem Freund machen? Bitte helfen. – Supremestar

0

dieses Versuchen Sie auch, wenn oben nicht genau

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; 
    } 
} 

Arbeits}