在 GridView 控件中添加一列复选框

 

步骤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 Sub DeleteSelectedProducts_Click(sender As Object, e As EventArgs) _
  2.     Handles DeleteSelectedProducts.Click
  3.     
  4.     Dim atLeastOneRowDeleted As Boolean = False
  5.  
  6.     ' Iterate through the Products.Rows property
  7.     For Each row As GridViewRow In Products.Rows
  8.         ' Access the CheckBox
  9.         Dim cb As CheckBox = row.FindControl("ProductSelector")
  10.         If cb IsNot Nothing AndAlso cb.Checked Then
  11.             ' Delete row! (Well, not really...)
  12.             atLeastOneRowDeleted = True
  13.  
  14.             ' First, get the ProductID for the selected row
  15.             Dim productID As Integer = _
  16.                 Convert.ToInt32(Products.DataKeys(row.RowIndex).Value)
  17.  
  18.             ' "Delete" the row
  19.             DeleteResults.Text &= String.Format( _
  20.                 "This would have deleted ProductID {0}<br />", productID)
  21.  
  22.             '... To actually delete the product, use ...
  23.             ' Dim productAPI As New ProductsBLL
  24.             ' productAPI.DeleteProduct(productID)
  25.             '............................................
  26.         End If
  27.     Next
  28.  
  29.     ' Show the Label if at least one row was deleted...
  30.     DeleteResults.Visible = atLeastOneRowDeleted
  31. End Sub

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 Sub ToggleCheckState(ByVal checkState As Boolean)
  2.     ' Iterate through the Products.Rows property
  3.     For Each row As GridViewRow In Products.Rows
  4.         ' Access the CheckBox
  5.         Dim cb As CheckBox = row.FindControl("ProductSelector")
  6.         If cb IsNot Nothing Then
  7.             cb.Checked = checkState
  8.         End If
  9.     Next
  10. End Sub

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


  
  
  1. Protected Sub CheckAll_Click(sender As Object, e As EventArgs) _
  2.     Handles CheckAll.Click
  3.     
  4.     ToggleCheckState(True)
  5. End Sub
  6.  
  7. Protected Sub UncheckAll_Click(sender As Object, e As EventArgs) _
  8.     Handles UncheckAll.Click
  9.     
  10.     ToggleCheckState(False)
  11. End Sub

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. GridViewcheckbox复选框使用: 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、付费专栏及课程。

余额充值