C# 跟踪哪个gridview行处于活动状态的线程安全方法
我有一个带有gridview的页面,其中包含一些从文本文件加载的内容。我已经可以编辑Gridview中的特定行。一旦用户单击行旁边的按钮,webusercontrolC# 跟踪哪个gridview行处于活动状态的线程安全方法,c#,asp.net,multithreading,gridview,C#,Asp.net,Multithreading,Gridview,我有一个带有gridview的页面,其中包含一些从文本文件加载的内容。我已经可以编辑Gridview中的特定行。一旦用户单击行旁边的按钮,webusercontrolUC:Edit将可见,用户可以编辑行项目 当我希望将编辑保存到gridview和txt文件时,问题就开始了。 我必须跟踪编辑了哪一行(我没有任何唯一的ID,所有列都可以更改) 下面的代码显示了我当前的解决方案(但我不确定它是否好)。现在,我在按下编辑按钮后保存行索引,并将其传递给我的WebUserControl。在那里它被保存为一个
UC:Edit
将可见,用户可以编辑行项目
当我希望将编辑保存到gridview和txt文件时,问题就开始了。
我必须跟踪编辑了哪一行(我没有任何唯一的ID,所有列都可以更改)
下面的代码显示了我当前的解决方案(但我不确定它是否好)。现在,我在按下编辑按钮后保存行索引,并将其传递给我的WebUserControl。在那里它被保存为一个私有静态int(必须是静态的,否则它总是默认的)
解决方案必须是线程安全的。有谁的解决方案比我的好吗?还有,我的sollution线程安全吗
(许多变量名称已被更改以使其更具可读性) 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" />
您不应该使用静态变量,因为它在整个应用程序中是“可见”的,当任何其他用户进入同一网页时,它可以更改(另请参见问题)。您正在寻找的是如何在ASP.NET回发之间持久化数据(您也可以在google上搜索ASP.NET状态管理)。有很多方法可以做到这一点,例如:Session、ViewState等。它们在很多地方都有描述,所以我不再重复这里的描述。例如,请看这个
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.
}
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).
}
}