检查gridview中是否修改了行

问题描述 投票:5回答:6

我有一个GridView,我只使用文本框对一列执行批量更新。但在更新之前,我需要检查整个gridview的文本框的值,如果值没有更改,我需要提供一个警告,说明“更改为要更新的字段”。

谁能建议我一些选择?

    protected void btnUpdate_Click(object sender, EventArgs e)
    {
        try
        {
            foreach (GridViewRow row in gvDetails.Rows)
            {
               string strID = ((Label)row.FindControl("lblID")).Text;
               string strGroup = ((Label)row.FindControl("lblGrp")).Text;
               string strValue = ((TextBox)row.FindControl("txtValue")).Text;                                     
               {
                   //my update query
               }
            }
        }
        catch (Exception ex)
        {

        }
    }
c# asp.net gridview
6个回答
5
投票

一个更简单的方法是将asp:HiddenField添加到ItemTemplate并比较每行的值。

<asp:HiddenField ID="" runat="server" Value='<%# Eval("blah") %>'></asp:HiddenField>

现在您只需将该值与代码隐藏中每行的文本框值进行比较,就像这样。

protected void btnUpdate_Click(object sender, EventArgs e)
{
    try
    {
        var isAnyRowUpdated = false;
        foreach (GridViewRow row in gvDetails.Rows)
        {
            string strID = ((Label)row.FindControl("lblID")).Text;
            string strGroup = ((Label)row.FindControl("lblGrp")).Text;
            string strValue = ((TextBox)row.FindControl("txtValue")).Text;
            string strOldValue = ((HiddenField)row.FindControl("hdnOldValue")).Value;
            if (strValue != strOldValue)
            {
                isAnyRowUpdated = true;
                //update procedure here.
            }
        }
        //now check if the flag is still false
        //that means no rows are changed
        if(!isAnyRowUpdated)
        {
            //alert no rows are updated
        }
    }
    catch (Exception ex)
    {

    }
}

我希望代码是自我解释的。


2
投票

您可以尝试使用DataGridView.RowValidating Event并检查IsCurrentRowDirty属性是否已更改

IsCurrentRowDirty属性获取一个值,该值指示当前行是否具有未提交的更改。

编辑:-

以上是Winforms的作品;在Asp.net中没有这样的方法,你必须在对象中加载数据,然后你必须验证。

你可以检查Updating Only Changed Rows Using GridView Control


0
投票

使用gridview的onrowdatabound属性。在里面,使用:

 protected void GridLocation_RowDataBound(object sender, GridViewRowEventArgs e)
    {
 if (e.Row.RowType == DataControlRowType.DataRow &&
   (e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit)
        {
        // here you can check your textbox values
        }
    }

0
投票

这里要做的基本事情是将原始数据加载到DataTable中,然后在特定列的循环中逐个比较GridView行,在您的情况下是TextBox列。为了比较DataTableGridView,您可以尝试这样的事情:

foreach (GridViewRow row in Grd.Rows)
{
   TextBox txtAmt = (TextBox)row.FindControl("txtAmount");
   string Id = Grd.DataKeys[row.RowIndex].Value.ToString();
   for (int i = 0; i < dt.Rows.Count; i++)
   {
      if (Id == dt.Rows[i]["ID"].ToString())
      {
         //do your logic here.
      }
   }
}

希望这可以帮助。


0
投票

根据对话,我提供了一些伪逻辑。您可以使用此实现自己的代码。

    protected void btnUpdate_Click(object sender, EventArgs e)
    {
        try
        {
            DataTable dt = LoadData(); //Load the data from DB
            EnumerableRowCollection<DataRow> enumerableDt = dt.AsEnumerable();

            foreach (GridViewRow row in gvDetails.Rows)
            {
                string strID = ((Label)row.FindControl("lblID")).Text;
                string strGroup = ((Label)row.FindControl("lblGrp")).Text;
                string strValue = ((TextBox)row.FindControl("txtValue")).Text;

                DataRow dr = enumerableDt.Where(x => x.Field<string>("ID") == strID).FirstOrDefault(); //Change your condition accordingly 

                if (dr["Value"].ToString().ToUpper() != strValue.Trim().ToUpper()) //Change your condition here
                {
                    //Do your updated data logic here
                }
                else
                {
                    //Do your not updated data logic here
                }
            }
        }
        catch (Exception ex)
        {

        }
    }

0
投票

根据相应项的datakey值检查它们。

<MasterTableView DataKeyNames="Response, ...

foreach (GridDataItem item in FTReport.MasterTableView.Items)
{
  string ResponseValue = tbResponse.Text;
  if (item.GetDataKeyValue("Response").ToString() != ResponseValue)
  {
    do something;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.