Need some help to solve this.
I have a gridview and inside the gridview I have a checkbox and after clicking the checkbox, I am doing a postback event and trying to update this particular row only on the database.
This is my gridview checkbox code. see the 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.
}
}
}
The above code works fine but it is getting me all the checkboxes that are checked irresepective of the one that I just checked. I don’t want all of them.
How can I get the only one row value that have been just checked. Some of the rows might have been checked already because the status is true for those records and I don’t want to update those records.
I think I’ve got my question right!
Update: The answer is:
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);
}
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Try this:
CheckBox chkBx = sender as CheckBox;
Rather than iterate all the rows.
I haven’t used CheckBox’s in a GridView in this way myself. Usually I would use the GridView’s OnRowCommand event instead and use the RowIndex or CommandArgument value to update the database.
Thinking about it OnRowcommand could be tricky for a CheckBox to fire, a better solution might be sticking with the CheckChanged event of the checkbox and navigate up to the GridViewRow serverside using controls NamingContainer. Something like:
GridViewRow row = chkBx.NamingContainer as GridViewRow;
I’m assuming the goes CheckBox => Cell => Row if you Google ASP.NET NamingContainer you’ll get some more specifics.
Method 2
Try this also if above not working exactly
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;
}
}
}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0