2009-08-27 5 views
7

Нужна помощь в решении этой проблемы.asp.net gridview checkbox selection

У меня есть gridview и внутри gridview. У меня есть флажок, и после нажатия на этот флажок я делаю событие postback и пытаюсь обновить эту конкретную строку только в базе данных.

Это мой код сетки. см. OnCheckedChanged.

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

Код:

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

Приведенный выше код работает нормально, но это становится мне все галочки, которые проверяются irresepective того, который я только что проверил. Я не хочу всех.

Как получить только одно значение строки, которое только что было проверено. Некоторые из строк, возможно, уже были проверены, потому что статус для этих записей верен, и я не хочу обновлять эти записи.

Я думаю, что у меня есть мой вопрос правильно!

Update: Ответ:

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

ответ

7

Попробуйте это:

CheckBox chkBx = sender as CheckBox; 

Вместо перебора всех строк.

Я не использовал CheckBox в GridView таким образом самостоятельно. Обычно я буду использовать событие OnRowCommand GridView и использовать значение RowIndex или CommandArgument для обновления базы данных.

Думать об этом OnRowcommand может быть сложным для CheckBox для запуска, лучшее решение может быть связано с событием CheckChanged этого флажка и перейти к серверу с поддержкой GridViewRow с помощью элементов управления NamingContainer. Что-то вроде:

GridViewRow row = chkBx.NamingContainer as GridViewRow; 

я предполагаю идет CheckBox => Ячейка => строка, если Google ASP.NET NamingContainer вы получите еще несколько особенностей.

+0

Спасибо за ваш ответ. Но мне нужны другие значения из этой же строки, так как я могу получить идентификатор строки этой конкретной строки gridview. так что я могу получить идентификатор записи. – Supremestar

+0

Затем я рекомендую не привязывать флажок OnCheckChanged, вместо этого использовать GridViews OnRowCommand, строка указана в GridVieweCommandEventArgs. –

+0

. HollyStyles, У меня нет поля команды select в Gridview, поэтому команда строки Gridview не запускается. Что мне делать с моим другом? Пожалуйста, помогите. – Supremestar

0

Попробуйте также, если выше не работает точно

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

}