Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建可由页面上的每个方法访问的DataTable变量?_C#_Asp.net_Datatable_Scope - Fatal编程技术网

C# 如何创建可由页面上的每个方法访问的DataTable变量?

C# 如何创建可由页面上的每个方法访问的DataTable变量?,c#,asp.net,datatable,scope,C#,Asp.net,Datatable,Scope,我是ASP.NET C#的新手。 我想创建一个持久化的DataTable,页面上的每个方法都可以访问它。listview控件绑定到datatable,因此当用户向datatable添加一行时,它将显示在listview中。 我希望DataTable保持不变,直到用户离开页面(或F5刷新)。 每个用户都必须有自己的DataTable实例,这一点很重要,因此ListView只显示该用户的行,而不显示其他用户的行。 我尝试声明一个静态变量,如下所示: namespace MySite { pu

我是ASP.NET C#的新手。 我想创建一个持久化的DataTable,页面上的每个方法都可以访问它。listview控件绑定到datatable,因此当用户向datatable添加一行时,它将显示在listview中。 我希望DataTable保持不变,直到用户离开页面(或F5刷新)。 每个用户都必须有自己的DataTable实例,这一点很重要,因此ListView只显示该用户的行,而不显示其他用户的行。 我尝试声明一个静态变量,如下所示:

namespace MySite
{
    public partial class MyPage: System.Web.UI.Page
    {
        public static DataTable dtbMyDataTable = new DataTable();
    public static DataTable dtbMyDataTable { set; get; }
但我后来发现,像这样的静态变量在应用程序域的生命周期中一直存在。另外,不同的用户没有自己的datatable实例,因此每个用户都在访问相同的datatable,并且可以在ListView中查看每个人的数据

我还尝试声明一个字段,如下所示:

namespace MySite
{
    public partial class MyPage: System.Web.UI.Page
    {
        public static DataTable dtbMyDataTable = new DataTable();
    public static DataTable dtbMyDataTable { set; get; }
但这产生了同样的问题,即用户没有自己的DataTable实例,因此每个用户都可以在ListView中看到其他用户的数据,这是不好的

我的另一个想法是在Page_Load中创建DataTable,然后将其存储为会话变量,以便在需要时可以通过其他方法访问DataTable中的数据。这也解决了用户仅访问自己数据的问题。问题是,如果用户离开计算机一段时间,会话将超时,用户将丢失数据

非常感谢所有建议。我花了很多时间在谷歌上搜索,结果空手而归

我是新来的堆栈溢出,所以请原谅我没有正确格式化这个问题。
谢谢您的帮助。

您只需在更大的范围内保存变量声明,但要在页面加载值,并检查它是否是回发:

namespace MySite
{
    public partial class MyPage: System.Web.UI.Page
    {
        public static DataTable dtbMyDataTable = new DataTable();

        protected void Page_Load(object sender, EventArgs e)
        {
           if (!IsPostBack)
           {
            dtbMyDataTable = LoadData(userID);
           }
           else
           {
              //process submitted values by the user here
           }
      }
}

您只需在更大的范围内保留变量声明,但在Page_load中加载值,并检查它是否为回发:

namespace MySite
{
    public partial class MyPage: System.Web.UI.Page
    {
        public static DataTable dtbMyDataTable = new DataTable();

        protected void Page_Load(object sender, EventArgs e)
        {
           if (!IsPostBack)
           {
            dtbMyDataTable = LoadData(userID);
           }
           else
           {
              //process submitted values by the user here
           }
      }
}

正如您所注意到的,listview、gridview等可以用数据表填充。您可以循环/交互gridview。但是,你的桌子呢

你必须自己解决它。有七种方法可以做到这一点

如果表很小(比如说只有50-100行),那么保存该表是合理的。您可以将表放在会话()中(服务器端存储-每个用户)

也可以使用ViewState。这是每个浏览器页面

所以,你经常看到这样说:

public class HotelEdit : System.Web.UI.Page
{
private DataTable MyTable;

protected void Page_Load(object sender, System.EventArgs e)
{
    if (System.Web.UI.Page.IsPostBack == false)
        LoadGrid();
    else
        MyTable = System.Web.UI.Page.Session["MyTable"];
}

public void LoadGrid()
{
    using (SqlCommand cmdSQL = new SqlCommand("SELECT * from tblHotels ORDER by HotelName", new SqlConnection(My.Settings.Test3)))
    {
        cmdSQL.Connection.Open();
        MyTable.Load(cmdSQL.ExecuteReader);
        ListView1.DataSource = MyTable;
        ListView1.DataBind();
    }

    System.Web.UI.Page.Session["MyTable"] = MyTable;
}

protected void cmdEdit_Click(object sender, EventArgs e)
{
    Button btn = sender;
    int RowID = btn.Attributes.Item("RowID");

    RowEdit(RowID);
}

public void RowEdit(int RowID)
{
    HotelList.Style("display") = "none";
    MyRedit.Style("display") = "normal";

    fLoader(MyRedit, MyTable.Rows(RowID));
}
}
因此,当我点击一个网格行时,按钮会运行RowEdit——注意我是如何将用户选择的行传递给名为fLoader(它是一个编辑器例程)的例程的——我使用的“MyTable”的作用域是整个表单


如前所述,在大多数情况下,您通常会重新加载一个表,但是对于一个“小”表,您可以按照上面所述持久化数据表,并在该页面中的所有事件和代码中使用它。

正如您所注意的,listview、gridview等可以用数据表填充。您可以循环/交互gridview。但是,你的桌子呢

你必须自己解决它。有七种方法可以做到这一点

如果表很小(比如说只有50-100行),那么保存该表是合理的。您可以将表放在会话()中(服务器端存储-每个用户)

也可以使用ViewState。这是每个浏览器页面

所以,你经常看到这样说:

public class HotelEdit : System.Web.UI.Page
{
private DataTable MyTable;

protected void Page_Load(object sender, System.EventArgs e)
{
    if (System.Web.UI.Page.IsPostBack == false)
        LoadGrid();
    else
        MyTable = System.Web.UI.Page.Session["MyTable"];
}

public void LoadGrid()
{
    using (SqlCommand cmdSQL = new SqlCommand("SELECT * from tblHotels ORDER by HotelName", new SqlConnection(My.Settings.Test3)))
    {
        cmdSQL.Connection.Open();
        MyTable.Load(cmdSQL.ExecuteReader);
        ListView1.DataSource = MyTable;
        ListView1.DataBind();
    }

    System.Web.UI.Page.Session["MyTable"] = MyTable;
}

protected void cmdEdit_Click(object sender, EventArgs e)
{
    Button btn = sender;
    int RowID = btn.Attributes.Item("RowID");

    RowEdit(RowID);
}

public void RowEdit(int RowID)
{
    HotelList.Style("display") = "none";
    MyRedit.Style("display") = "normal";

    fLoader(MyRedit, MyTable.Rows(RowID));
}
}
因此,当我点击一个网格行时,按钮会运行RowEdit——注意我是如何将用户选择的行传递给名为fLoader(它是一个编辑器例程)的例程的——我使用的“MyTable”的作用域是整个表单


如前所述,在大多数情况下,您通常会重新加载一个表,但对于一个“小”表,您可以按照上面所述持久化数据表,并在该页面的所有事件和代码中使用它。

类中的其他方法可以访问任何字段。你能为你的问题添加更多细节吗?这是一个网络应用程序。管理国家是一门艺术。将其置于会话中可能是一种方法,但不要依赖于它总是在那里(例如,您打算如何知道用户已从页面导航,或者刚刚关闭浏览器选项卡)。您需要设计如何计划管理用户、他们的身份验证/授权、他们的会话和状态。如果你在多个服务器之间进行负载平衡,它会变得更加有趣,似乎你试图让服务器记住太多;服务器本身不应该为每个并发用户单独保存大量的用户数据,持续数小时。您应该更多地考虑跟踪用户id,将用户数据保存在其他地方(数据库),在他们需要时加载并提供给他们,在他们想要保存数据时接受他们的更新(或自动保存例程定期将小数据推回),还有一点值得指出的是,你似乎正在开发一个web表单应用程序,它至少比微软目前关注的web技术落后了几代人(之后是MVC,现在是Blazor)-你真的想在新开发中使用它吗?从概念上讲,这就是webforms对页面数据所做的一切-你建议在一个隐藏字段中放置一个csv,它在viewstate中放置一个datatable-这一切都会来回穿梭并在每一端恢复(但你的csv想法是手动执行的),所以仍然有这样的概念“数据必须存储在某个地方“-它要么在服务器的会话中,要么在跨管道传输的数据中,要么在客户机中。”。。或者使用一些技巧尽可能地将其最小化,将大部分内容保留在数据库中,并使用Json/xhr发送位,这是一种现代的方式。。有点像80年代的大型机:)任何字段都可以被类中的其他方法访问。你能为你的问题添加更多细节吗?这是一个网络应用程序。管理国家是一门艺术。把它放在会议上可能是一条路,但不要总是依赖于它(如何,