c# web gridview checkbox 应用

简介

在前面的教程中 , 我们学习了如何为 GridView 控件添加一列 单选 按钮来选择一个特定的记录。当用户被限制最多只能从网格中选中一项时,一列单选按钮是一个非常恰当的用户界面。然而,有时我们还想让用户从网格中随便选择任意数量的项目。例如,基于 Web 的电子邮件客户端通常使用一列复选框控件来显示邮件列表。用户可以从中随意选择若干个邮件后执行某些操作,例如把这些邮件移动到另一个文件夹中或删除这些邮件。

在本教程中 , 我们将了解怎样添加一列复选框 , 以及如何确定回传时哪些复选框被选中。尤其是我们还将创建一个例子,这个例子逼真地模仿了基于 Web 的电子邮件客户端用户界面。我们的例子将会包含一个已分页的 GridView 控件,这个控件列出了 Products 数据库中的所有产品,并且每个产品行都有一个复选框(参见图 1 )。单击 “Delete Selected Products” 按钮后,将会删除被选中的产品。

图1 :每个产品行都包含了一个 复选框

步骤1 : 添加一个列出产品信息的分页的GridView 控件

在考虑如何添加一列 复选框 之前 , 让我们先关注一下如何在支持分页的 GridView 控件中列出产品信息。首先,打开 EnhancedGridView 文件夹中的 CheckBoxField.aspx 页,然后将一个 GridView 控件从工具箱中拖放到设计器中,并将其 ID 设置为 Products 。接下来,把 GridView 控件绑定到一个名为 ProductsDataSource 的新 ObjectDataSource 上。将 ObjectDataSource 配置使用 ProductsBLL 类,即调用 GetProducts() 方法返回数据。因为这个 GridView 控件是只读的,所以在 UPDATE 、 INSERT 和 DELETE 选项卡中将下拉列表的设置为 “(None)” 。

图2 : 创建一个名为 ProductsDataSource 的新 ObjectDataSource

图3 :配置 ObjectDataSource 以便使用 GetProducts() 方法返回数据

图4 : 将 UPDATE 、INSERT 和 DELETE 选项卡中的下拉列表设置为 “(None)”

完成Configure Data Source 向导后 ,Visual Studio 将会自动为与产品相关的的数据域创建BoundColumns 和 CheckBoxColumn 。与我们在前面教程中所做的一样,除了 ProductName 、 CategoryName 和 UnitPrice BoundField 外,删除所有其他 BoundField ,并将 HeaderText 属性更改为 “Product” 、 “Category” 和 “Price” 。配置 UnitPrice BoundField ,以便将它的值格式化为货币形式。再通过从智能标记上选中 “Enable Paging” 复选框将 GridView 配置为 支持分页。

另外 , 我们还要添加用来删除选定产品的用户界面。在 GridView 控件的下方添加一个 Web 按钮控件,将其 ID 设置为 DeleteSelectedProducts ,将其 Text 属性设置为 “Delete Selected Products” 。本例子中不是将产品从数据库中实际删除,而是要显示一条消息指出将要被删除的产品。为了实现这个目的,需要在 Button 控件下方添加一个 Web 标签控件,将其 ID 设置为 DeleteResults ,清除它的 Text 属性,并将它的 Visible 和 EnableViewState 属性值设置为 False 。

完成这些更改之后 ,GridView 控件、ObjectDataSource 控件、Button 控件和 Label 控件的声明标记应类似如下 :


  
  
  1. <p>
  2.     <asp:GridView ID="Products" runat="server" AutoGenerateColumns="False" 
  3.         DataKeyNames="ProductID" DataSourceID="ProductsDataSource" 
  4.         AllowPaging="True" EnableViewState="False">
  5.         <Columns>
  6.             <asp:BoundField DataField="ProductName" HeaderText="Product" 
  7.                 SortExpression="ProductName" />
  8.             <asp:BoundField DataField="CategoryName" HeaderText="Category" 
  9.                 ReadOnly="True" SortExpression="CategoryName" />
  10.             <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" 
  11.                 HeaderText="Price" HtmlEncode="False" 
  12.                 SortExpression="UnitPrice" />
  13.         </Columns>
  14.     </asp:GridView>
  15.  
  16.     <asp:ObjectDataSource ID="ProductsDataSource" runat="server" 
  17.         OldValuesParameterFormatString="original_{0}" 
  18.         SelectMethod="GetProducts" TypeName="ProductsBLL">            
  19.     </asp:ObjectDataSource>
  20. </p>
  21. <p>
  22.     <asp:Button ID="DeleteSelectedProducts" runat="server" 
  23.         Text="Delete Selected Products" />
  24. </p>
  25. <p>
  26.     <asp:Label ID="DeleteResults" runat="server" EnableViewState="False" 
  27.         Visible="False"></asp:Label>
  28. </p>

花点时间在浏览器中浏览一下这个页面 ( 参见图5 ) 。此时 , 您应该看到前十个产品的名称、类别和价格信息。

图5 : 列出的前十个产品的名称、类别和价格信息

步骤2 : 添加一列复选框

因为ASP.NET 2.0 包含了 CheckBoxField , 有些人会想到使用它来为 GridView 控件添加一列 复选框 。但实际情况并非这样,因为 CheckBoxField 只对 Boolean 数据域起作用。也就是说,为了能够使用 CheckBoxField ,我们必须指定一个基础数据字段,然后通过查询该字段的值来确定已呈现的复选框是否被选中。我们不能使用 CheckBoxField 来包含一列未选中的复选框。

取而代之 , 我们必须添加一个 TemplateField ,并 为其 ItemTemplate 添加一个 CheckBox Web 控件。继续进行,为 Products GridView 添加一个 TemplateField ,使它成为第一个(最左边的)字段。在 GridView 的智能标记中单击 “Edit Templates” 链接,接着将一个 CheckBox Web 控件从工具箱拖放到 ItemTemplate 中。将该 CheckBox 控件的 ID 属性设置为 ProductSelector 。

图6 : 为 TemplateField 的 ItemTemplate 添加一个名为ProductSelector 的 CheckBox Web 控件

添加了TemplateField 和 CheckBox Web 控件后 , 每行都包含了一个复选框。图7 显示的这个画面就是在添加 TemplateField 和CheckBox 后 , 通过浏览器看到的画面。

图7 : 现在每个产品行都包含一个 复选框

步骤3 : 回传确定哪些复选框被选定

虽然现在我们已经有了一列复选框 , 但是我们还是没有办法确定回传选中的那些 复选框 。因为单击 “Delete Selected Products” 按钮时,我们需要知道哪些复选框被选中,从而将这些产品删除。

GridView 的 Rows 属性 提供了一种访问 GridView 中行的途径。我们可以循环遍历这些行,通过编码访问 CheckBox 控件,然后通查询它的 Checked 属性来确定这个 CheckBox 是否被选中。

为DeleteSelectedProducts Web 按钮控件的Click 事件创建一个Event Handler , 并添加以下代码 :


  
  
  1. protected void DeleteSelectedProducts_Click(object sender, EventArgs e)
  2. {
  3.     bool atLeastOneRowDeleted = false;
  4.  
  5.     // Iterate through the Products.Rows property
  6.     foreach (GridViewRow row in Products.Rows)
  7.     {
  8.         // Access the CheckBox
  9.         CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
  10.         if (cb != null && cb.Checked)
  11.         {
  12.             // Delete row! (Well, not really...)
  13.             atLeastOneRowDeleted = true;
  14.  
  15.             // First, get the ProductID for the selected row
  16.             int productID = 
  17.                 Convert.ToInt32(Products.DataKeys[row.RowIndex].Value);
  18.  
  19.             // "Delete" the row
  20.             DeleteResults.Text += string.Format(
  21.                 "This would have deleted ProductID {0}<br />", productID);
  22.         }
  23.     }
  24.  
  25.     // Show the Label if at least one row was deleted...
  26.     DeleteResults.Visible = atLeastOneRowDeleted;
  27. }

Rows 属性会返回一个 GridViewRow 实例集合 , 这个集合组成了 GridView 控件的各个数据行 , 这里的 For Each 循环逐一列举了集合中的各个数据行元素。对每个GridViewRow 对象来说 , 使用row.FindControl("controlID") 方法通过编码来访问每行的 Checkbox 控件。如果 CheckBox 控件被选中,那么就会从 DataKeys 集合中返回该行相应的 ProductID 值。在本练习中,我们只是在 DeleteResults Label 中简单地显示了一些信息性消息,而在一个实际应用程序中,我们将改为调用 ProductsBLL 类的 DeleteProduct(productID) 方法。

添加了这个 Event Handler 后 , 单击 “Delete Selected Products” 按钮 , 现在就会显示选中产品的 ProductID 。

图8 : 单击 “Delete Selected Products” 按钮时 , 列出了选中产品的ProductID

步骤4 : 添加“Check All” 和“Uncheck All” 按钮

如果用户想删除当前页面上的所有产品 , 他们必须选中每一页面上的 10 个 复选框 。我们可以帮助他们快速实现这个操作,而这一切只需添加一个 “Check All” 按钮。单击这个按钮后,会选中网格中的所有复选框。而 “Uncheck All” 按钮同样有用。

在页面中添加两个 Web 按钮控件,把它们放在 GridView 控件的上面。将第一个按钮的 ID 属性设置为 CheckAll ,将它的 Text 属性设置为 “Check All” ;将第二个按钮的 ID 设置为 UncheckAll ,将它的 Text 属性设置为 “Uncheck All” 。


  
  
  1. <asp:Button ID="CheckAll" runat="server" Text="Check All" />
  2. &nbsp;
  3. <asp:Button ID="UncheckAll" runat="server" Text="Uncheck All" />

接下来 , 在代码文件类中创建一个名为ToggleCheckState(checkState) 的方法 , 当这个方法被调用时 , 会逐一列举Products GridView 控件的行 Rows 集合, 然后将每行的CheckBox 控件的Checked 属性设置为传进的 checkState 的参数值。


  
  
  1. private void ToggleCheckState(bool checkState)
  2. {
  3.     // Iterate through the Products.Rows property
  4.     foreach (GridViewRow row in Products.Rows)
  5.     {
  6.         // Access the CheckBox
  7.         CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
  8.         if (cb != null)
  9.             cb.Checked = checkState;
  10.     }
  11. }

接下来 , 为CheckAll 按钮和 UncheckAll 按钮创建 Event Handler 。在 CheckAll 的 Event Handler 中 , 只需简单调用ToggleCheckState(true) 方法 ; 而在UncheckAll 的Event Handler 中 , 需要调用ToggleCheckState(False) 方法。


  
  
  1. protected void CheckAll_Click(object sender, EventArgs e)
  2. {
  3.     ToggleCheckState(true);
  4. }
  5.  
  6. protected void UncheckAll_Click(object sender, EventArgs e)
  7. {
  8.     ToggleCheckState(false);
  9. }

有了这些代码 , 单击“Check All” 按钮时 , 会引起回传 , 并会选中 GridView 中的所有 复选框 。同样,单击 “Uncheck All” 会取消选中所有复选框。图 9 显示的是单击 “Check All” 按钮后的屏幕。

图9 : 单击 “Check All” 按钮 , 选中所有 复选框

注意 : 当显示一列 复选框 时 , 有一种方法可以用来全选中或全不选中所有的 复选框, 那就是选中或不选中标题行的 复选框 。还有,通常 “Check All”/“Uncheck All” 的执行需要一个回传。尽管这些复选框能被选中还是不能被选中,完全可以通过客户端脚本来实现,但这里仍然提供了一种令人耳目一新的用户体验。为了详细探讨使用标题行的复选框来实现 “Check All” 和 “Uncheck All” 功能,以及使用客户端技术,请查阅 使用客户端脚本和 Check All CheckBox 全部选中 GridView 中的复选框

小结

在需要让用户可以从 GridView 控件中选择任意数量的行之前 , 首先需要添加一列复选框。正如我们在本教程中所了解的那样,要在 GridView 控件中包含一列复选框,必须添加一个带有 CheckBox Web 控件的 TemplateField 。通过使用 Web 控件(与向模板中直接插入标记文字相反,正如我们在前面教程中所做的那样), ASP.NET 能够在整个回传期间自动记住哪些 CheckBox 控件被选中,哪些没有被选中。我们还可以通过编码访问这些 CheckBoxes 控件,以便确定给的的 CheckBox 控件是否被选中,或选中状态是否被更改。。

本教程和上一个教程都着眼于为 GridView 控件添加一行选择器列。在下一个教程中,我们将会详细探讨如何以最小的工作量为 GridView 控件添加插入功能。

快乐编程!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. GridView中的checkbox复选框使用: GridView中的复选框可以用来选择多行记录,实现全选功能等。 在GridView控件中,设置列的DataField属性为一个布尔型的字段,在列的TemplateField中添加一个Checkbox控件,并设置它的Checked属性为DataBind中绑定的布尔型字段值。 示例代码: ``` <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"> <Columns> <asp:TemplateField> <HeaderTemplate> <asp:CheckBox ID="chkAll" runat="server" onclick="checkAll(this);" /> </HeaderTemplate> <ItemTemplate> <asp:CheckBox ID="chk" runat="server" Checked='<%# Convert.ToBoolean(Eval("IsSelected")) %>' /> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="Name" HeaderText="Name" /> <asp:BoundField DataField="Age" HeaderText="Age" /> </Columns> </asp:GridView> ``` 2. Echarts图的使用: Echarts是一款开源的可视化图表库,支持多种图表类型,如折线图、柱状图、饼图等。 在C#中使用Echarts,可以通过前端技术(如JavaScript)来实现,也可以使用Echarts.NET库来实现,前者需要在前端页面中引入Echarts.js文件,后者需要在C#代码中引入Echarts.NET库。 以下是使用Echarts.NET库实现柱状图的示例代码: ``` using ECharts.Entities; using ECharts.Entities.series; using Newtonsoft.Json; public partial class Demo : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Chart chart = new Chart(); chart.Title.Text = "柱状图示例"; Legend legend = new Legend(); legend.Data.Add("销量"); Axis xAxis = new Axis(); xAxis.Data.Add("衬衫"); xAxis.Data.Add("羊毛衫"); xAxis.Data.Add("雪纺衫"); xAxis.Data.Add("裤子"); xAxis.Data.Add("高跟鞋"); xAxis.Data.Add("袜子"); Axis yAxis = new Axis(); SeriesBar series = new SeriesBar(); series.Name = "销量"; series.Data.Add(5); series.Data.Add(20); series.Data.Add(36); series.Data.Add(10); series.Data.Add(10); series.Data.Add(20); chart.Legend = legend; chart.XAxis = xAxis; chart.YAxis = yAxis; chart.Series.Add(series); string json = JsonConvert.SerializeObject(chart); string script = string.Format("var myChart = echarts.init(document.getElementById('chartContainer'));myChart.setOption({0});", json); Page.ClientScript.RegisterStartupScript(this.GetType(), "EchartsScript", script, true); } } ``` 在前端页面中,需要添加一个div元素来显示图表,并引入Echarts.js文件和jQuery库: ``` <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script src="Scripts/jquery-3.3.1.min.js"></script> <script src="Scripts/echarts.min.js"></script> </head> <body> <div id="chartContainer" style="width: 600px;height:400px;"></div> </body> </html> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值