2009-08-27 31 views
7

Potrzebujesz pomocy, aby rozwiązać ten problem.asp.net wybór pola wyboru gridview

Mam gridview i wewnątrz gridview Mam pole wyboru i po kliknięciu checkbox, robię postback zdarzenia i próbuje zaktualizować ten konkretny wiersz tylko w bazie danych.

To jest mój kod pola wyboru gridview. zobacz OnCheckedChanged.

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

Kod:

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

Powyższy kod działa poprawnie, ale jest coraz mnie wszystkie pola, które są zaznaczone irresepective od tego, który właśnie sprawdziłem. Nie chcę ich wszystkich.

Jak uzyskać tylko jedną wartość wiersza, która została właśnie sprawdzona. Niektóre wiersze mogły już zostać sprawdzone, ponieważ status jest prawdziwy dla tych rekordów i nie chcę aktualizować tych rekordów.

Myślę, że mam pytanie poprawnie!

Update: Odpowiedź brzmi:

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

Odpowiedz

7

Spróbuj tego:

CheckBox chkBx = sender as CheckBox; 

Zamiast iteracyjne wszystkie wiersze.

Nie użyłem CheckBox w GridView w ten sposób ja. Zwykle używam zdarzenia OnRowCommand GridView i używam wartości RowIndex lub CommandArgument do aktualizacji bazy danych.

Myślenie o tym OnRowcommand może być trudne do uruchomienia CheckBox, lepsze rozwiązanie może trzymać się z wydarzeniem CheckChanged tego pola wyboru i przejść do strony GridViewRow używając kontrolek NamingContainer. Coś jak:

GridViewRow row = chkBx.NamingContainer as GridViewRow; 

jestem przy założeniu, że idzie CheckBox => Cela => Wiersz jeśli Google ASP.NET NamingContainer dostaniesz trochę więcej szczegółów.

+0

Dziękuję za odpowiedź. Ale potrzebuję innych wartości z tego samego wiersza, więc jak mogę uzyskać identyfikator wiersza tego konkretnego wiersza gridview. tak, żebym mógł zdobyć potwierdzenie. – Supremestar

+0

Następnie zaleca się nie wiązać pola wyboru OnCheckChanged, zamiast tego użyj OnRidViews OnRowCommand, wiersz jest dostarczany w GridVieweCommandEventArgs –

+0

HollyStyles, Nie mam pola wyboru polecenia w widoku Grid, więc polecenie wiersza Gridview nie uruchamia się. Co powinienem zrobić mojemu przyjacielowi? Proszę o pomoc. – Supremestar

0

Spróbuj również jeśli powyżej nie działa dokładnie

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

}