线程安全的方式来跟踪什么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).
    }
}

线程安全的方式来跟踪什么gridview行是活跃的

你不应该使用静态变量,因为它在整个应用程序中是"可见的",当任何其他用户进入相同的网页时,它可以被更改(参见这个问题)。您正在寻找的是如何在ASP之间持久化数据。. NET回发(你也可以谷歌ASP. NET。. NET状态管理)。有很多方法可以做到这一点,例如:Session, ViewState等。它们在很多地方都有描述,所以我在这里不再重复描述。例如,请参阅本文。