【问题标题】:How to have a DataTable's contents survive the end of a scope?如何让 DataTable 的内容在范围结束后仍然存在?
【发布时间】:2011-10-28 17:25:04
【问题描述】:

我有一个 DataTable,它在我的课程开始时声明如下:

private DataTable table = new TestData().FillTable();

在整个课程中,我都可以访问表格的内容。

但是,我有一个 GridView 排序事件,它会更改 DataTable 的内容。在事件本身中,内容发生了变化,我已经通过调试确认了这一点。但是,如果我从该方法之外的任何地方调用该表,DataTable 的内容将保持原样,即一旦 soerting 事件的范围结束,新值似乎会被删除。

这是我的排序事件的代码:

protected void TableGridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        table.DefaultView.Sort = "GroupNumber, " + e.SortExpression + GetSortDirectio(e.SortExpression);
        TableGridView.DataSource = table;
        TableGridView.DataBind();
    }

当我在上述事件中测试表的内容时,似乎添加了新值。但是,如果我从任何其他方法调用该表,则会返回旧值。

我可以做些什么来使表格的内容全局更新,即更新到在我的类开始时声明的变量,并且不会因方法而具有不同的状态?

【问题讨论】:

  • 您使用 this.table 有什么特别的原因吗?如果它是一个类变量,只需使用它就可以了。但同样,这不是我想的答案。试试看嘛。该死的,我希望我有一个 IDE 可以在这里工作:(
  • 我也试过不使用 'this',还是不行:/
  • 奇怪,连 MSDN 都说创建并返回了一个新的 DT。
  • 我已经调试过无数次了——每次,排序事件中都会出现表格的差异,但是一旦范围结束,更改并没有保存。这让我发疯 - 不知何故,我认为我做错了什么
  • 所有文章都说 ToTable 创建了一个新表并将信息保存在 DT 上,而不仅仅是 Table 方法。嘿顺便说一句,您从表中创建的视图。所以视图有点链接到表,你更新到表回来。我看到这里有些可疑。

标签: c# .net asp.net oop datatable


【解决方案1】:

我已经使用 GridView 排序事件对此进行了测试。离开排序事件 this.table 包含排序的值,因此它按预期工作。您确定要在单页请求中测试您的解决方案吗? PostBack 后 this.table 再次从 TestData().FillTable() 赋值。

【讨论】:

  • 这就是问题所在,你是对的。刚刚对其进行了测试,果然在事件发生后,表格再次从 TestData().FillTable() 分配。您对我如何防止它这样做有任何想法吗?
  • 我不确定您为什么需要排序的 DataTable 类字段,因此我的解决方案可能不适合您。首先,您必须在 GridView 中分配 DataKeyNames 属性。然后您可以使用 YourGridViewObject.DataKeys 集合来获取当前绑定行的顺序。在 Page_Load 中加载您的 DataTable,然后使用 DataKeyName 对 DataTable 进行排序。其他解决方案是将 DataTable 序列化为 ViewState(对页面大小的影响)或 Session(对服务器内存和性能的影响)。您也可以使用数据库。你可以在link找到更多信息
  • 感谢您提供的重要信息 :) 我将尝试使用 DataKeyname 方法,但是考虑到一旦完成排序,GridView 会再次被数据绑定,这是一个问题。 IE。 gridview 会丢失之前添加的 DataKeyname 值吗?
猜你喜欢
  • 1970-01-01
  • 2015-06-15
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2016-12-22
相关资源
最近更新 更多