如何在gridview中将复选框ID发送到一个字符串中以进行批量更新

时间:2010-06-15 21:19:02

标签: c# asp.net

我有一个带有复选框的网格,当选择顶部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,并将其传递给程序

由于

1 个答案:

答案 0 :(得分:0)

以下是我处理类似情况的方法(使用jQuery检查复选框):

  1. 向列标题
  2. 添加一个<asp:CheckBox Id="whatever" CssClass="chkAllSelector" ...
  3. CssClass="chkRowSelector"添加到您当前的复选框
  4. 使用更新按钮或链接按钮向此列的页脚添加页脚模板。
  5. 在按钮的onclick中,执行更新。
  6. 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”。