C# 跟踪哪个gridview行处于活动状态的线程安全方法

C# 跟踪哪个gridview行处于活动状态的线程安全方法,c#,asp.net,multithreading,gridview,C#,Asp.net,Multithreading,Gridview,我有一个带有gridview的页面,其中包含一些从文本文件加载的内容。我已经可以编辑Gridview中的特定行。一旦用户单击行旁边的按钮,webusercontrolUC:Edit将可见,用户可以编辑行项目 当我希望将编辑保存到gridview和txt文件时,问题就开始了。 我必须跟踪编辑了哪一行(我没有任何唯一的ID,所有列都可以更改) 下面的代码显示了我当前的解决方案(但我不确定它是否好)。现在,我在按下编辑按钮后保存行索引,并将其传递给我的WebUserControl。在那里它被保存为一个

我有一个带有gridview的页面,其中包含一些从文本文件加载的内容。我已经可以编辑Gridview中的特定行。一旦用户单击行旁边的按钮,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).
    }
}