目标 我需要的是通过 ASP.NET 在网页上向用户显示一个 SQL 数据表,并允许他们非常快速轻松地选择许多行,然后点击多个不同按钮中的任何一个来表示不同的操作。选定的行将被发送出去进行处理(通常通过代码隐藏发送到 web 服务或类似的服务)。这是一个有点通用的解决方案,因为我将在许多地方使用相同的设置 - 因此数据和可用操作会有所不同。
目标是能够基本上对数据一无所知——这是为了让用户理解。如果这个概念已经不可能(尽管我相信它不是),请告诉我。
从 T-SQL(SQL Server 2008 R2 或更高版本)中提取。使用 ASP.NET 制作 aspx 网页。Codebehind 是在 VB.NET 中完成的,在这两种情况下我们都使用 4.0 我精通 C# 和 VC++,所以如果你不能轻松地翻译你的代码,不要担心。
问题 我的问题一直是为用户创建一个行选择过程,该过程在对表格进行排序或分页时仍然存在,对用户来说很快并且响应时间相对较快,这反映在 GridView 的绑定数据中(因为这允许我在 DataView 上使用过滤器来生成用于传递的 DataTable)。如果有另一种方法可以知道选定的行,那么只要它对用户来说是持久且快速的,我就会全力以赴。
我没有调试,也没有语法问题(我不相信) - 我不知道如何继续。我不一定需要代码作为解决方案 - 我需要了解我的隐喻是否是不好的做法,或者只是不常见,因此没有得到很好的支持。在任何一种情况下,什么是合适的方法?如果不出意外,除了无尽的 API 和教程之外,我在哪里寻找解决方案?
我最初的计划 是我想使用 asp:GridView 来绑定从 TSQL 中提取的 DataTable,因为我可以自动生成列。这使我无需知道它是什么就可以显示数据。我计划添加一个特定的布尔列(最左边)来存储用户的行选择。然后我可以简单地在 DataTable 上运行一个过滤器以生成一个 DataView,从该 DataView 中获取生成的 DataTable,并将它传递到链中。
除了我们的特定选择之一之外的所有列都是只读的。用户没有编辑数据 - 他们选择记录并与可查看的相关数据并排查看他们的选择。
值得注意的是,我计划检查名称冲突,以便我们添加的列不会与 DataTable 中的任何现有列冲突 - 我会根据需要使用“选择”重命名它,后跟循环产生的整数,将我的名字与其他列,根据需要递增。
我假设一旦我设置了它,它就会自行处理:用户可以单击生成的复选框列单元格,它会即时更改数据。保存选择的重点是为了方便,他们的选择通过排序和分页保持不变(我保存了 GridView 的数据源并在必要时重新绑定)。用户是否刷新页面并完全丢失他们的复选框并不重要 - 他们需要查看任何更改/新数据,并且他们不需要更多的时间来检查他们想要的任何内容。
这没有发生。
我发现 AutoGenerateColumns 不会为布尔数据列生成复选框。它产生文本,所以我最终得到了“真”或“假”这个词。
我开始寻找一种方法来获取单元格中用于布尔数据列的复选框。我发现对于添加的布尔列,我可以使用属性 DataField 将 asp:CheckBoxField 绑定到它。当然,我必须弄清楚如何将它指向一个变量 DataField ......
<Columns>
<asp:CheckBoxField DataField="Select" HeaderText="Select"
ReadOnly="False" SortExpression="Select">
<ItemStyle HorizontalAlign="Center" />
</asp:CheckBoxField>
</Columns>
但是,因为 GridView 是为逐行编辑而设计的,所以所有生成的 CheckBox 都被禁用并且无法选中。这是因为它们的包含行不在 Edit Mdoe 中。我不想使用按钮或类似的比喻来启用逐行编辑,因为用户经常需要检查几行。更多的点击是不好的,而且很烦人。他们应该只专注于他们的数据和做出选择,而不是担心记住进入和结束编辑模式。此外,这个比喻似乎在这里放置得不好,因为复选框是 -ONLY- 可编辑的数据 - 并且不是表示数据的一部分。
当然,我可以创建一个继承自 GridView 的新类,重载生成列以生成复选框而不是文本字段的方法 - 但我觉得必须有一条更直接的路径。也许这是要走的路?但也许它会有与上面相同的编辑问题——我不确定。
所以,接下来我尝试在我的 GridView 中使用 asp:TemplateField 作为列。此 TemplateField 包含一个 asp:CheckBox,其 Checked 状态基于底层绑定数据值。这里的问题是尝试更改检查状态更新该绑定值。我需要一些查找 GridView 值的方法,然后我可以使用它在 DataTable 中查找同一行。我见过使用主键的好例子。虽然我可以假设每个人都为任何可能的表保留一个主键,但情况可能并非如此!我可以自己进一步添加主键,但现在看起来我将添加和删除两列,然后再将 DataTable 传递给 WebService 而不是一个。同样,我还需要能够分配一个动态的列名以避免冲突。
<asp:TemplateField HeaderText="Select">
<ItemTemplate>
<asp:CheckBox runat="server" ID="CheckBox"
Checked="<%# DataBinder.Eval(Container.DataItem, "Select") %>"
AutoPostBack="true" OnCheckedChanged="SelectCheckBox_CheckChanged" />
</ItemTemplate>
</asp:TemplateField>
我停了下来——这条路也是相当间接的。当然,有一种更清洁、更简单的方法可以做到这一点。有人以一种或另一种方式显示只读数据以进行处理/更新/更改的情况是否不常见?
我选择的 GridView 很差吗?我还没有找到另一种表示表格数据的好方法。