我有一个带有复选框的网格,当选择顶部chek框时,select all将选中gridview中的所有复选框并将更新。对于此即时通讯使用 for循环,它每次都超越,这需要花费很多时间,因此网格中有超过100条记录。
try
{
string StrOutputMessageDisplayDocReqCsu = string.Empty;
string strid = string.Empty;
string strflag = string.Empty;
string strSelected = string.Empty;
for (int j = 0; j < GdvDocReqMU.Rows.Count; j++)
{
CheckBox Chkupdate = (CheckBox)GdvDocReqMU.Rows[j].Cells[1].FindControl("chkDR");
if (Chkupdate != null)
{
if (Chkupdate.Checked)
{
strid = ((Label)GdvDocReqMU.Rows[j].FindControl("lblIDDocReqCsu")).Text;
strflag = ((Label)GdvDocReqMU.Rows[j].FindControl("lblStatusDocReqCsu")).Text;
cmd = new SqlCommand("sp_Update_v1", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@id", strSelected);
cmd.Parameters.AddWithValue("@flag", DdlStatusDocReqMU.SelectedValue);
cmd.Parameters.AddWithValue("@notes", txtnotesDocReqMU.Text);
cmd.Parameters.AddWithValue("@user", strUseridDRAhk);
cmd.Parameters.Add(new SqlParameter("@message", SqlDbType.VarChar, 100, ParameterDirection.Output, false, 0, 50, "message", DataRowVersion.Default, null));
cmd.UpdatedRowSource = UpdateRowSource.OutputParameters;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
}
//}
StrOutputMessageDisplayDocReqCsu += (string)cmd.Parameters["@message"].Value + "<br/>";
lbldbmessDocReqAhk.Text += StrOutputMessageDisplayDocReqCsu + "<br>";
GetgridDocReq();
}
catch (Exception ex)
{
lbldbmessDocReqAhk.Text = ex.Message.ToString();
}
有些人可以帮助我,我可以在一个字符串中捕获所有id,并将其传递给程序
由于
答案 0 :(得分:0)
以下是我处理类似情况的方法(使用jQuery检查复选框):
<asp:CheckBox Id="whatever" CssClass="chkAllSelector" ...
CssClass="chkRowSelector"
添加到您当前的复选框ASP.NET复选框控件很奇怪,因为它包围了生成的输入的范围。
以下是我之前使用过的jQuery代码:
$('.chkAllSelector > input:checkbox').click(function() {
$('.chkRowSelector > input:checkbox').each(
function(){
this.checked = $('.chkAllSelector > input:checkbox').attr('checked');
}
);
});
$('.chkRowSelector > input:checkbox').click(function() {
if ($('.chkAllSelector > input:checkbox').is(':checked') && !($(this).is(':checked')))
{ $('.chkAllSelector > input:checkbox').removeAttr('checked'); }
});
至于你的sql语句,由于你使用的是一次只更新一行的存储过程,你将为每一行进行一次调用。我建议编写另一个存储过程,它接受一组id并设置检查值。请注意,对于所有选中的值,您必须执行一次此调用,对于所有未选中的值,您必须执行一次此调用。如果您检查/取消选中的逻辑非常原子,例如选中此框不会更改存储过程中其他表中的值,最好创建一个简单的更新语句并在此处使用它。如果不了解存储过程中的逻辑,很难说。
为了避免使用更新方案带来许多麻烦,您可能还想查看SqlDataSource:http://quickstarts.asp.net/QuickStartv20/aspnet/doc/ctrlref/data/sqldatasource.aspx
我几乎可以使用ObjectDataSource,因为它可以很好地处理插入/更新/删除逻辑。
编辑:获取以逗号分隔的值列表:
string idsCsv = GdvDocReqMU.Rows.Cast<GridViewRow>()
.Where(x => ((CheckBox)x.FindControl("chkDR")).Checked)
.Select(x => GdvDocReqMU.DataKeys[x.RowIndex].Value.ToString())
.ToArray().Join(',');
我刚从头开始写这篇文章,所以如果它没有一点调整就会感到惊讶,但这是一般的想法。
为此,您必须设置gridview的DataKeyNames =“Id”,其中“Id”是被绑定行的id。例如,如果您从sql绑定并且绑定到gridview的列是“Customer_Id”,那么您将拥有DataKeyNames =“Customer_Id”。