线程安全的方式来跟踪什么gridview行是活跃的
本文关键字:gridview 什么 活跃 跟踪 安全 方式 线程 | 更新日期: 2023-09-27 18:14:19
我有一个页面与gridview包含一些东西从文本文件加载。我已经可以在Gridview中编辑特定的行。一旦用户单击行旁边的按钮,就可以看到webusercontrol UC:Edit
,用户可以编辑行项。
当我希望将编辑保存到gridview和文本文件时,我的问题开始了。我必须保持跟踪哪一行被编辑(我没有任何唯一的id和所有列可以改变)。
下面的代码显示了我当前的解决方案(我不确定它是好的)。到目前为止,一旦编辑按钮被按下,我保存rowIndex并将其传递给我的WebUserControl。在这里,它被保存为私有静态int(必须是静态的,否则它总是默认的)。
解决方案必须是线程安全的。有人有比我更好的解决方案吗?还有,我的解决方案线程安全吗?
(许多变量名已经被改变,使其更易于阅读)
ASP
<asp:GridView ID="gvList" runat="server" AutoGenerateColumns="false"
OnRowCommand="gvList_RowCommand">
<!-- gridviewstuff -->
</asp:GridView>
<UC:Edit id="ctlEdit" runat="server" OnSave="ctlEdit_Save" Visible="false" />
后台代码> protected void gvList_RowCommand(object sender, GridViewCommandEventArgs e)
{
if(e.CommandName == "wEdit")
{
int rowIndex = -1;
for (int i = 0; i < gvList.Rows.Count; i++)
{
if(gvList.Rows[i].Cells[2].Text == (string)e.CommandArgument)
{
rowIndex = i;
}
}
try
{
if(rowIndex != -1)
{
ctlEdit.LoadEdit(/*Some info as a string*/, rowIndex);
}
else
//The rest is irrelevant.
}
}
}
protected void ctlEdit_Save(object sender, myNamespace.ControlNamespace.WorkEndedEventArgs e)
{
List<string> lines = new List<string>();
//Reading a full text file. Each string in 'lines' contains one row.
if(e.rowIndex != -1)
{
lines[e.rowIndex] = e.workItem;
}
//Override the text file with the new list.
}
Edit.ascx.cs
namespace myNamespace.ControlNamespace
{
public class WorkEndedEventArgs : EventArgs
{
public int rowIndex { get; set; }
public string workItem { get; set; }
}
public partial class Edit : System.Web.UI.UserControl
{
private static int _rowIndex;
/*stuff*/
public void LoadEdit(string someinput, int rowIndex)
{
_rowIndex = rowIndex;
/*stuff*/
}
/*stuff*/
protected void btnSave_Click(object sender, EventArgs e)
{
/*stuff*/
OnSave(new WorkEndedEventArgs() { workItem = someString, rowIndex = _rowIndex });
}
//The rest of the save-things are done as usual (delegates and stuff).
}
}
你不应该使用静态变量,因为它在整个应用程序中是"可见的",当任何其他用户进入相同的网页时,它可以被更改(参见这个问题)。您正在寻找的是如何在ASP之间持久化数据。. NET回发(你也可以谷歌ASP. NET。. NET状态管理)。有很多方法可以做到这一点,例如:Session, ViewState等。它们在很多地方都有描述,所以我在这里不再重复描述。例如,请参阅本文。