ASP.net 企业级应用开发 信息工程系:罗明刚
第八章 数据绑定控件(二)
目标 使用DataGrid显示数据库中的数据 使用DataGrid的模板列 选择、更新和删除DataGrid 中的记录
DataGrid 控件概述 ASP.NET 中的 DataGrid 控件用于以表格格式显示数据 DataGrid 控件派生自 System.Web.UI.WebControls.DataGrid 类 要使用 DataGrid 控件,可在 Web 窗体上拖放控件或者双击工具箱中的该控件 工具箱的“Web 窗体”选项卡中的 DataGrid 控件如图所示 Web 窗体中的 DataGrid 控件如图所示
为 DataGrid 控件绑定数据 2-1 要在 DataGrid 控件中查看数据,必须将它绑定到一个数据源 步骤 要在 DataGrid 控件中查看数据,必须将它绑定到一个数据源 使用 DataSource 属性为 DataGrid 指定数据源,然后用 DataMember 属性指定要显示的数据源中的表 打开 VS.NET 集成开发环境 选择 ASP.NET 应用程序,然后为项目命名 拖放 DataAdapter 组件 将此网页重命名为 DataGridDemo.aspx 完成“数据适配器配置向导”中的步骤 指定 SQL 服务器,并选择列 将 DataGrid 控件添加到 Web 窗体 选择“生成数据集”,然后给定合适的名称 将 DataGrid 重命名为 dgDisplay 在 dgDisplay 的“属性”窗口中选择 DataSource 和 DataMember
为 DataGrid 控件绑定数据 2-2 DataGrid 输出结果 定义数据源后,应将以下两行代码添加到页面 此属性指定唯一标识表中给定行的列 // 填充数据集 SqlDataAdapter objSqlDataAdapter.Fill(dsPublishers,"Publishers"); // 填充数据网格 dgDisplay.DataBind(); DataGrid 的外观现在已更改,显示出表 publishers 中的列名 定义数据源后,应将以下两行代码添加到页面 的 Load 事件,然后填充 DataGrid DataGrid
设置页眉和页脚 输出结果 可使用“属性生成器”对话框设置 DataGrid 的页眉和页脚 使用“属性生成器”对话框指定各列的页脚文本和页眉文本 输出结果 属性生成器
使用数据格式表达式格式化 DataGrid 中显示的数据 设置格式表达式 使用数据格式表达式格式化 DataGrid 中显示的数据 右击 Datagrid,选择“属性生成器” 选择数据格式表达式中给出的列 指定格式表达式 dd/mm/yyyy 格式化数据 mm/dd/yyyy 格式表达式的作用 格式表达式设置为{0:D}
模板列 3-1 通过右击 DataGrid 并选择“编辑模板”,再选择“注册”列,可将 Checkbox 控件添加到“模板”列 “模板”列允许组合使用 HTML 控件和服务器控件设计列的自定义布局 通过右击 DataGrid 并选择“编辑模板”,再选择“注册”列,可将 Checkbox 控件添加到“模板”列 此时显示如图所示的模板编辑器 模板只针对特定的列,不能应用于自动生成的列中 第 1 列 第 2 列 模板编辑器
模板列 3-2 模板编辑器显示模板列的四个属性: HeaderTemplate 此属性获取或设定的模板用于定义模板列的页眉 DataGrid 现在于“注册”列的各行中显示一个复选框 HeaderTemplate 此属性获取或设定的模板用于定义模板列的页眉 ItemTemplate 此属性获取或设定的模板用于显示模板列中选定的项 EditItemTemplate 此属性获取或设定的模板用于编辑模板列中的数据项 FooterTemplate 此属性获取或设定的模板用于定义模板列的页脚 将一个复选框拖放到 ItemTemplate 框中
模板列 3-3 确定 publishers 是否注册的用户自定义函数 在复选框容器中调用 IsRegistered() public bool IsRegistered(string country) { if(country == "USA") return true; return false; } <asp:CheckBox id="CheckBox1" runat="server" Enabled = False Checked = '<%# IsRegistered(Convert.ToString(DataBinder .Eval(Container.DataItem, "country")))%>'> </asp:CheckBox> 将数据绑定到模板列
EditCommandColumn 使用数据库时需要执行三项基本任务,分别是: 选择数据 更新数据 删除数据
选择 DataGrid 中的行 要选择DataGrid中的记录,可使用“按钮列”中的“选择” 输出结果 要选择DataGrid中的记录,可使用“按钮列”中的“选择” 要确定用户选择的行,可使用 DataGrid 的 SelectedIndexChanged 事件 要为 dgDisplay 生成 SelectedIndexChanged 事件,可双击 dgDisplay 的“属性”窗口中显示的 SelectedIndexChanged 事件 private void dgDisplay_SelectedIndexChanged(object sender, System.EventArgs e) { lblMessage.Text = “您已选定 " + dgDisplay.SelectedItem.Cells[1].Text; } 在 DataGrid 中选择记录
更新数据 4-1 DataGrid 控件 EditItemIndex EditCommandColumn 编辑 更新 取消 呈现用于更新数据界面的方式之一是向用户提供一组数据,允许用户选择要更新的行 DataGrid 控件 EditItemIndex EditCommandColumn 编辑 更新 取消
在“属性生成器”对话框中,将“编辑、更新、取消”从“按钮列”添加到“选定的列”列表中 更新数据 4-2 在“属性生成器”对话框中,将“编辑、更新、取消”从“按钮列”添加到“选定的列”列表中 要为 dgDisplay 生成 EditCommand 事件处理程序,请双击 dgDisplay 的“属性”窗口中显示的 EditCommand 事件 public void dgDisplay_EditCommand(object source, System.Web. UI.WebControls.DataGridCommandEventArgs e) { dgDisplay.EditItemIndex = e.Item.ItemIndex; BindGrid(); }
更新数据 4-3 try { if(sqlConnection1.State == ConnectionState.Closed) sqlConnection1.Open(); sqlDataAdapter1.UpdateCommand.ExecuteNonQuery(); lblMessage.Text = "<b>Record Updated</b><br>" ; dgDisplay.EditItemIndex = -1; } sqlConnection1.Close(); catch(SqlException exc) if (exc.Number == 2627) lblMessage.Text = "错误:已存在相同主键的记录 "; else lblMessage.Text = exc.ToString() + "错误:无法更新记录,请确保字段都" + "已正确填写"; BindGrid(); 要为 dgDisplay 生成 UpdateCommand 事件处理程序,请双击 dgDisplay 的“属性”窗口中显示的 UpdateCommand 事件 public void dgDisplay_UpdateCommand(object source , System.Web.UI.WebControls.DataGridCommandEventArgs e) { sqlUpdateCommand1.Parameters["@Original_pub_id"].Value = dgDisplay.DataKeys[(int)e.Item.ItemIndex]; sqlUpdateCommand1.Parameters["@pub_id"].Value = ((TextBox)e.Item.Cells[0].Controls[0]).Text; sqlUpdateCommand1.Parameters["@pub_name"].Value= ((TextBox)e.Item.Cells[1].Controls[0]).Text; sqlUpdateCommand1.Parameters["@city"].Value = ((TextBox)e.Item.Cells[2].Controls[0]).Text; sqlUpdateCommand1.Parameters["@state"].Value = ((TextBox)e.Item.Cells[3].Controls[0]).Text; sqlUpdateCommand1.Parameters[“@country”].Value = ((TextBox)e.Item.Cells[4].Controls[0]).Text;
更新数据 4-4 显示编辑模式下的 DataGrid 控件 dgDisplay 要为 dgDisplay 生成 CancelCommand 事件处理程序,请双击 gDisplay 的“属性”窗口中显示的 CancelCommand 事件 public void dgDisplay_CancelCommand(object source, System.Web. UI.WebControls.DataGridCommandEventArgs e) { dgDisplay.EditItemIndex = -1; BindGrid(); } 这确保 DataGrid 中无记录处于编辑模式下 编辑模式下的 DataGrid
要为用户给出删除行的选项,可将名为“删除”的按钮列 删除数据 2-1 要为用户给出删除行的选项,可将名为“删除”的按钮列 添加到 DataGrid 控件
删除数据 2-2 要为 dgDisplay 生成 dgDisplay_DeleteCommand 事件处理程序,请双击 dgDisplay 的“属性”窗口中显示的 DeleteCommand 事件 输出结果 private void dgDisplay_DeleteCommand(object source, System.Web. UI.WebControls.DataGridCommandEventArgs e) { sqlDataAdapter1.DeleteCommand.Parameters["@Original_pub_id"].Value = dgDisplay.DataKeys[(int)e.Item.ItemIndex]; try if(sqlConnection1.State == ConnectionState.Closed) sqlConnection1.Open(); sqlDataAdapter1.DeleteCommand.ExecuteNonQuery(); 续.. lblMessage.Text = “<b>删除的记录</b><br>"; sqlConnection1.Close(); } catch (SqlException exc) { lblMessage.Text = exc.ToString() + “错误:不能删除记录"; BindGrid(); 删除 DataGrid 中的记录
通用的 ButtonColumn 下列显示的代码在确定在 DataGrid 上的执行命令是否为 Convert 之后将文本形式的供应商名称转换为大写 除了“选择”、“编辑、更新、取消”等执行不同任务的一些命令以外,也可以将一般按钮列添加到 DataGrid 单击 DataGrid 中第一行的“转换”链接后,输出结果显示如下: private void dgDisplay_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { if (((LinkButton)e.CommandSource).CommandName == "Convert") lblMessage.Text = e.Item.Cells[1].Text.ToUpper(); } 确定所单击按钮的命令名称,并执行相应的代码 添加按钮列
使用 DataGrid 分页可以按指定每页显示的记录数量,并显示导航按钮
在 DataGrid 中与分页相关联的事件是 PageIndexChanged,每当请求另一页时就会发生该事件 输出结果 private void dgDisplay_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e) { dgDisplay.CurrentPageIndex = e.NewPageIndex; BindGrid(); }
总结 在 .NET 中,Web 窗体 DataGrid 控件派生自类System.Web.UI.WebControls.DataGrid 使用 DataSource 和 DataMember 属性可将 DataGrid 绑定到数据源 TemplateColumn 允许指定在列中出现的控件。TemplateColumn 的页眉、页脚、项目和编辑项目等 4 项定义了模板列的内容和外观 可使用 Select、Edit、Update、Cancel 和 Delete 等 ButtonColumns 来选择、更新和删除 DataGrid 中的记录 对 DataGrid 进行分页使用户能按页显示指定数量的记录 DataGrid 的“属性生成器”对话框定义了用于自定义 DataGrid 的页眉、页脚、列、分页及各种其他设置