Repeater,ListView,DataList,DataGrid,GridView...选择哪一个?

112

有很多不同的控件可供选择!在ASP.NET中确定用于显示数据的最佳控件的最佳实践是什么?


2
这个编程问题只有一个明确的答案:取决于什么。你想要做什么? - Tomalak
@Tomalak 我只是在显示一份数据列表...通常我会使用 Repeater,但想看看使用其他方法的优缺点。 - mattruma
5个回答

149

这实际上取决于你想要实现什么目标

  • Gridview - 在设计方面有限,像 HTML 表格一样工作。内置更多的功能,如编辑/更新、分页、排序。但是开销很大。

  • DataGrid - Gridview 的旧版本。Gridview 是一个超级数据网格。

  • Datalist - Gridview 的可定制版本。也有一些开销。需要手动设计。

  • ListView - 新的 Datalist :). 几乎是 datalist 和 gridview 的混合体,可以使用分页和内置 gridview 类似的功能,但具有设计自由度。这个家族中的新控件之一。

  • Repeater - 非常轻量级。没有内置的标题、页脚等功能。拥有最少的开销。


12
这个回答还是否有效?(因为它来自2008年,现在是2013年) - Michel Ayres
3
自 .NET 4.5 开始,Michel Repeater 已经变得强类型化了。我非常喜欢这个特性。 - Evgeni Nabokov
1
@MichelAyres 我会总体上说是肯定的。虽然自2008年以来,微软对WebForms进行了一些更新,但回答中传达的一般思想是相同的。 - akousmata
3
哦,"没有像页眉、页脚之类的内置功能",但是有HeaderTemplate和FooterTemplate可以使用,如果你想要放置像<table>和</table>这样的标签。 - Ads

29

其他人的回答已经说得很清楚了:这取决于具体情况。

以下是一些具体的指南(基于WebDude上面的优秀回答)……

你的设计是否适合自然地将数据显示在电子表格或网格视图中?使用GridView

你需要显示数据列表或其他格式化视图,可能带有标题和页脚,并且可能针对每个数据记录具有特定控件和/或格式化方式吗?(例如,自定义链接,可能是LinkButtons,或者特定的编辑控件?)这种显示在电子表格或网格视图中无法自然呈现吗?使用ListView

如果您符合ListView的所有标准,但自然而然适合网格,则可以考虑使用DataList

当我只需要基本数据和一些自定义设计元素进行迭代时,我选择Repeater,没有页眉、页脚,整洁美观。


19

标记视图

对于所有三种控件(ListView、DataList、Repeater),都可以声明以下示例代码。

<asp:ListView runat="server" OnItemCommand="Unnamed1_ItemCommand">
<ItemTemplate> <%# Eval("Name")%>    </ItemTemplate>
<asp:ListView>

在下面的列表中,您可以看到每个模板的可用选项,并自行查看它们之间的区别。
ListView(请注意编辑、分组、插入、布局)
- AlternatingltemTemplate - EditltemTemplate - EmptyDataTemplate - EmptyltemTemplate - GroupSeparatorTemplate - GroupTemplate - lnsertltemTemplate - ItemSeparatorTemplate - ItemTemplate - LayoutTemplate - SelectedltemTemplate DataList(请注意样式对)
- AlternatingltemStyle - AlternatingltemTemplate - EditltemStyle - EditltemTemplate - FooterStyle - FooterTemplate - HeaderStyle - HeaderTemplate - ItemStyle - ItemTemplate - SelectedltemStyle - SelectedltemTemplate - SeparatorStyle - SeparatorTemplate Repeater
  • AlternatingltemTemplate(交替项模板)
  • FooterTemplate(页脚模板)
  • HeaderTemplate(页眉模板)
  • ItemTemplate(项模板)
  • SeparatorTemplate(分隔符模板)

代码视图(高级视图)

CompositeDataBoundControl

请查看以下类层次结构(以及相关控件)。

这些控件在其模板中托管其他asp.net控件,以向用户显示绑定数据。

The CompositeDataBoundControl classes(and related controls)

更好的澄清说明

列表视图控件

列表视图控件也使用模板来显示数据。然而,它支持许多额外的模板,允许在处理数据时考虑更多情况。这些模板包括LayoutTemplate(布局模板),GroupTemplate(分组模板),ItemSeparatorTemplate(项分隔符模板)

列表视图控件(与DataList和Repeater不同)还隐式地支持使用数据源控件编辑、插入和删除数据的能力。您可以为每个场景定义单独的模板。

数据列表控件

数据列表控件的工作方式类似于Repeater控件。它为数据集中的每一行重复数据,并根据定义的模板显示这些数据。 然而,它将模板中定义的数据布局到各种HTML结构中。这包括水平或垂直布局的选项,它还允许您设置数据如何重复,如流式或表格布局。

DataList控件不会自动使用数据源控件来编辑数据。相反,它提供了命令事件,您可以在这些场景下编写自己的代码。为了启用这些事件,您需要将Button控件添加到其中一个模板,并设置按钮的CommandName属性为edit、delete、update或cancel关键字。然后DataList控件将引发相应的事件。
Repeater控件也使用模板来定义自定义绑定。然而,它不会将数据显示为单个记录,而是按照您在模板中指定的方式重复数据行。这使您可以创建一行数据,并将其在整个页面上重复显示。
Repeater控件是一个只读模板。也就是说,它仅支持ItemTemplate,不支持隐式编辑、插入和删除。如果您需要此功能,则应考虑其他控件,否则您将不得不为Repeater控件编写代码。
上述描述来自于MCTS考试70-515微软.NET Framework 4 Web应用程序开发一书。
在该书中并未提及DataGrid,而是被流行的GridView所取代,并由其他用户给出了很好的解答。

1
所有答案的描述都很棒! - Ali007
我的天哪...一个完整答案的定义。干得好。 - user3308043

6
这一切都取决于您想如何布局您的数据。如果您需要控制布局(如表格与CSS等),则使用Repeater或ListView。在这两者之间,ListView为您提供了更多的事件和内置命令以进行编辑、选择、插入。此外还有分页和分组功能。Repeater非常简单,它重复一个带有数据的布局。由于您是手动构建布局,因此Listview和Repeater需要更多的代码。
GridView是更新的DataGrid,因此几乎没有理由使用DataGrid。当连接到标准ASP.NET数据源时,GridView的工作效果非常好,但会限制您的布局规则。GridView需要较少的代码,因为您正在使用内置布局。

6

确实如此!我已经在博客中介绍了ASP.NET 4.0数据工具之间的差异。基本上,Gridview是呈现表格信息最强大的方式,而ListView控件适用于显示重复数据的更复杂的显示。如果我要给一个ASP.NET新手建议,我会告诉他们先彻底学习Gridview并忽略其他控件。


只是为了给自己的博客添加一条评论:2-3年后,我实际上建议学习ASP.NET MVC,这使得问题变得无关紧要(也使得从网格中引发事件变得微不足道)。然而,这是一个漫长的学习曲线! - Andy Brown

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