我有一个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)
{
}
}
一个更简单的方法是将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)
{
}
}
我希望代码是自我解释的。
您可以尝试使用DataGridView.RowValidating Event并检查IsCurrentRowDirty属性是否已更改
IsCurrentRowDirty属性获取一个值,该值指示当前行是否具有未提交的更改。
编辑:-
以上是Winforms的作品;在Asp.net中没有这样的方法,你必须在对象中加载数据,然后你必须验证。
使用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
}
}
这里要做的基本事情是将原始数据加载到DataTable
中,然后在特定列的循环中逐个比较GridView
行,在您的情况下是TextBox
列。为了比较DataTable
和GridView
,您可以尝试这样的事情:
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.
}
}
}
希望这可以帮助。
根据对话,我提供了一些伪逻辑。您可以使用此实现自己的代码。
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)
{
}
}
根据相应项的datakey值检查它们。
<MasterTableView DataKeyNames="Response, ...
foreach (GridDataItem item in FTReport.MasterTableView.Items)
{
string ResponseValue = tbResponse.Text;
if (item.GetDataKeyValue("Response").ToString() != ResponseValue)
{
do something;
}
}