2009-08-27 43 views
7

Cần một số trợ giúp để giải quyết vấn đề này.Chọn hộp kiểm asp.net gridview

Tôi có chế độ xem lưới và bên trong GridView Tôi có hộp kiểm và sau khi nhấp vào hộp kiểm, tôi đang thực hiện sự kiện postback và cố gắng cập nhật hàng cụ thể này chỉ trên cơ sở dữ liệu.

Đây là mã kiểm tra chế độ xem lưới của tôi. xem 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. 
     } 
    } 
} 

Đoạn mã trên hoạt động tốt nhưng nó là nhận được cho tôi tất cả các hộp kiểm được kiểm tra irresepective của một trong đó tôi chỉ kiểm tra. Tôi không muốn tất cả chúng.

Làm cách nào tôi có thể nhận giá trị hàng duy nhất vừa được chọn. Một số hàng có thể đã được kiểm tra vì trạng thái là đúng đối với các bản ghi đó và tôi không muốn cập nhật các bản ghi đó.

Tôi nghĩ mình đã có câu hỏi đúng!

Cập nhật: Câu trả lời là:

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

Trả lời

7

Hãy thử điều này:

CheckBox chkBx = sender as CheckBox; 

Thay vì lặp tất cả các hàng.

Tôi chưa sử dụng CheckBox trong GridView theo cách này. Thông thường tôi sẽ sử dụng sự kiện OnRowCommand của GridView thay vào đó và sử dụng giá trị RowIndex hoặc CommandArgument để cập nhật cơ sở dữ liệu.

Suy nghĩ về nó OnRowcommand có thể phức tạp khi CheckBox kích hoạt, một giải pháp tốt hơn có thể gắn với sự kiện CheckChanged của hộp kiểm và điều hướng đến máy chủ GridViewRow bằng cách sử dụng điều khiển NamingContainer. Một cái gì đó như:

GridViewRow row = chkBx.NamingContainer as GridViewRow; 

tôi giả đi CheckBox => di động => Row nếu bạn Google ASP.NET NamingContainer bạn sẽ nhận được một số chi tiết cụ thể hơn.

+0

Cảm ơn bạn đã trả lời của bạn. Nhưng tôi cần một số giá trị khác từ cùng một hàng như vậy làm thế nào tôi có thể nhận được hàng Id của hàng Gridview cụ thể đó. để tôi có thể lấy Id hồ sơ. – Supremestar

+0

Sau đó, tôi khuyên bạn không nên ràng buộc các OnCheckChanged của hộp kiểm, sử dụng GridViews OnRowCommand thay vào đó, hàng được cung cấp trong GridVieweCommandEventArgs –

+0

HollyStyles, Tôi không có một trường lệnh chọn trong Gridview để Gridview hàng lệnh không bắn. Tôi nên làm gì với bạn tôi? Vui lòng trợ giúp. – Supremestar

0

Hãy thử điều này cũng nếu ở trên không làm việc chính xác

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

}

Các vấn đề liên quan