如何获取GridView的底层数据源?

3

我在我的asp.net web应用程序中使用3.5框架的GridView。我正在使用List绑定GridView。在网格内,更新和删除功能都可以正常运行。但是我的保存功能需要从数据源中提取列表,然后通过循环将新列表插入到数据库中。但是当我尝试以传统方式获取时,它返回了null。

我尝试了以下方法来检索List:

1. List<MyClass> list = (List<MyClass>gv.DataSource);
2. List<MyClass> list = gv.DataSource as List<MyClass>;
3. IDataSource idt = (IDataSource)gv.Datasource;
   List<MyClass> list = (List<MyClass>)idt;

但是很不幸,每次我都得到了 null。

只是出于好奇...为什么要检索列表,然后将新列表插入数据库?直接提交到数据库,然后重新同步数据绑定不是更有意义吗?如果您要重新提交整个列表到数据库,则每次都必须覆盖表,或者最终得到比实际需要的数据多得多的数据。 - guildsbounty
是的,你说得对,我之前也是这么想的。实际上,我的场景是需要一个可编辑的表格,用户可以直接通过表格进行添加、更新和删除操作。我已经使用数据集实现了相同的功能,但是我不知道为什么数据没有显示出来。所以,如果你有任何关于我的问题的好的参考资料,请发帖分享,这将对我非常有帮助。 - user240141
3个回答

7
一旦数据源被绑定并且页面已经呈现,您将无法检索数据源。但是您可以使用以下几种方法来保留数据源:
  1. 在绑定之前将数据存储在Session中。
  2. 在绑定之前将数据存储在ViewState中。
  3. 从数据库或其他数据存储库中检索原始数据。
  4. 在其他地方保持正在进行的更改缓存(例如SessionViewState等)。
我建议尽量避免使用数据源的拖放操作和数据绑定。
因此,在您的情况下,请将列表存储在可访问的位置,并在每次操作时对其进行操作和重新绑定。然后,当您想要进行“保存”操作时,只需处理底层的数据对象(List),该对象已存储并用于定义GUI。 GridView不是数据存储区,而只是一种基于数据存储区呈现数据的控件。

3

您可以遍历GridView的所有项,并将所有项添加回创建的新列表中。

像这样的代码是我使用的:

List<Categories> myList = new List<Categories>();
foreach (GridViewRow row in grdCategory.Rows)
{
    Categories newCat = new Categories();
    Label catID = row.FindControl("lblCatID") as Label;
    newCat.catID = Convert.ToInt32(catID.Text);
    ...
    ...
    myList.Add(newCat);
}

虽然这个问题已经发布了一段时间,但我希望这篇文章能够帮到一些人。


grdCategroy.Rows 只会循环遍历网格的第一页行。 - Ali Saeed

0

一旦列表被绑定并显示出来,数据源就会消失。您需要重新创建数据源并使用主键访问特定对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接