|
 |
栏目导栏 |
|
| |
|
|
|
|
 |
资料搜索 |
|
| |
|
|
|
|
 |
热门文章 |
|
| |
|
|
|
|
 |
最新文章 |
|
| |
|
|
|
| |
| |
|
|
|
| |
| 使用 ASP+ DataGrid 控件来创建主视图/详细资料视图 |
|
Step6Page.cs: ktdLinux联盟 ktdLinux联盟 namespace Samples { ktdLinux联盟 ... ktdLinux联盟 ktdLinux联盟 public class Step6Page : Page { ktdLinux联盟 ktdLinux联盟 // 更新当前选定的作者并重新加载与选定内容对应的书名 ktdLinux联盟 // 网格 ktdLinux联盟 protected void LoadTitlesGrid() { ktdLinux联盟 UpdateSelection(); ktdLinux联盟 titlesGrid.DataBind(); ktdLinux联盟 } ktdLinux联盟 ktdLinux联盟 // 处理书名网格中的 CancelCommand 事件,以 ktdLinux联盟 // 不施用更改就结束编辑 ktdLinux联盟 protected void OnCancelCommandTitlesGrid(object sender, ktdLinux联盟 DataGridCommandEventArgs e) { ktdLinux联盟 titlesGrid.EditItemIndex = -1; ktdLinux联盟 LoadTitlesGrid(); ktdLinux联盟 } ktdLinux联盟 ktdLinux联盟 // 处理书名网格中的 EditCommand 事件,以 ktdLinux联盟 // 开始编辑某一行 ktdLinux联盟 protected void OnEditCommandTitlesGrid(object sender, ktdLinux联盟 DataGridCommandEventArgs e) { ktdLinux联盟 titlesGrid.EditItemIndex = e.Item.ItemIndex; ktdLinux联盟 LoadTitlesGrid(); ktdLinux联盟 } ktdLinux联盟 ktdLinux联盟 // 处理书名网格中的 UpdateCommand 事件,以施用 ktdLinux联盟 // 所作的更改并结束编辑 ktdLinux联盟 protected void OnUpdateCommandTitlesGrid(object sender, ktdLinux联盟 DataGridCommandEventArgs e) { ktdLinux联盟 TextBox priceText = ktdLinux联盟 (TextBox)e.Item.FindControl("Column3Control"); ktdLinux联盟 string newPrice = priceText.Text.Substring(1); ktdLinux联盟 ktdLinux联盟 DataSet ds = GetSessionData(); ktdLinux联盟 DataTable titlesTable = ds.Tables["Title"]; ktdLinux联盟 ktdLinux联盟 string titleID = ktdLinux联盟 (string)titlesGrid.DataKeys[e.Item.ItemIndex]; ktdLinux联盟 DataRow[] rows = titlesTable.Select("title_id = '" + ktdLinux联盟 titleID + "'"); ktdLinux联盟 DataRow editRow = rows[0]; ktdLinux联盟 ktdLinux联盟 editRow.BeginEdit(); ktdLinux联盟 editRow["price"] = newPrice; ktdLinux联盟 editRow.EndEdit(); ktdLinux联盟 editRow.AcceptChanges(); ktdLinux联盟 titlesGrid.EditItemIndex = -1; ktdLinux联盟 LoadTitlesGrid(); ktdLinux联盟 } ktdLinux联盟 } ktdLinux联盟 } ktdLinux联盟 ktdLinux联盟 EditCommand 事件是在单击 Edit 按钮时引发的。只需将 DataGrid 的 EditItemIndex 属性设定为包含被单击按钮的项目的索引的属性。要防止编辑某一个别行,不采取任何动作就返回。另外,要继续进行编辑,就必须重新加载数据源并调用 DataBind。这通过调用 LoadTitlesGrid 方法来完成。 ktdLinux联盟 ktdLinux联盟 您必须处理的第二个事件就是 CancelCommand 事件。这是单击 Cancel 按钮时引发的。实施十分类似于前一处理器。如想结束编辑,则只需将 EditItemIndex 属性重置为 ?,并重新加载数据源。如果需要维持行的编辑模式,则仅需不采取任何动作就从函数返回即可。 ktdLinux联盟 ktdLinux联盟 要处理的最后一个事件就是 UpdateCommand 事件,这是单击 Update 按钮时引发的。这里是实际工作发生的地方。从存在于项目中的控件抽取新的值,然后更新数据源。一旦将新的值使用完毕,就将 EditItemIndex 重置为 ?,以返回到只读模式,并连同其数据源一起重新加载控件。对于前两个事件,您可以不采取任何动作就从该函数返回,以保持该行的编辑模式状态。 ktdLinux联盟 ktdLinux联盟 这一步又再次举例说明控件中实施的显式数据绑定模型。在这一实施情形中,只在某行的状态从只读模式更改为编辑模式或相反时才需要数据源。注意, DataGrid 自身并不更新其数据源。实质上,数据绑定是单向的。采用本模型的目的在于让您拥有对数据源更新的控制。在大多数典型的应用程序中,更新需要预处理,并且是由业务对象或已存储的过程来调用的。另外,单向数据绑定并不要求每个时间都有实时的数据源。 ktdLinux联盟 ktdLinux联盟 ktdLinux联盟 第 7 步: 使用模板 ktdLinux联盟 ktdLinux联盟 DataGrid 控件通过使用 TemplateColumns,支持列内模板。可以完全自由地决定与这些列相关联的单元格的内容。这一步使用 TemplateColumn 来增强首先在前一步中实施的编辑支持。 ktdLinux联盟 ktdLinux联盟 图 8. 完成第 7 步后的页面 ktdLinux联盟 ktdLinux联盟 Titles DataGrid 来自: ktdLinux联盟 ktdLinux联盟 Step7.aspx: ktdLinux联盟 ktdLinux联盟 <asp:DataGrid id="titlesGrid" runat="server" ktdLinux联盟 ...> ktdLinux联盟 ktdLinux联盟 <property name="Columns"> ktdLinux联盟 ... ktdLinux联盟 <asp:TemplateColumn HeaderText="Price"> ktdLinux联盟 <template name="ItemTemplate"> ktdLinux联盟 <asp:Label runat="server" ktdLinux联盟 Text='<%# DataBinder.Eval(Container.DataItem, "price", ktdLinux联盟 "{0:c}") %>'/> ktdLinux联盟 </template> ktdLinux联盟 ktdLinux联盟 <template name="EditItemTemplate"> ktdLinux联盟 <asp:RequiredFieldValidator runat="server" ktdLinux联盟 ControlToValidate="priceText" Display="Dynamic"> ktdLinux联盟 <img src="Error.gif" height="16" width="16" title="Required" ktdLinux联盟 align="absmiddle"> ktdLinux联盟 </asp:RequiredFieldValidator> ktdLinux联盟 <asp:RegularExpressionValidator runat="server" ktdLinux联盟 ControlToValidate="priceText" Display="Dynamic" ktdLinux联盟 ValidationExpression="\$[0-9]+(\.[0-9][0-9]?)?"> ktdLinux联盟 <img src="Error.gif" height="16" width="16" ktdLinux联盟 title="Invalid currency value" ktdLinux联盟 align="absmiddle"> ktdLinux联盟 </asp:RegularExpressionValidator> ktdLinux联盟 <asp:TextBox id="priceText" runat="server" ktdLinux联盟 Text='<%# DataBinder.Eval(Container.DataItem, "price", ktdLinux联盟 "{0:c}") %>' ktdLinux联盟 Width="45px" BorderStyle="Solid" BorderWidth="1px" ktdLinux联盟 BorderColor="Black"> ktdLinux联盟 </asp:TextBox> ktdLinux联盟 </template> ktdLinux联盟 ktdLinux联盟 <property name="HeaderStyle"> ktdLinux联盟 <asp:TableItemStyle Width="50px"/> ktdLinux联盟 </property> ktdLinux联盟 <property name="ItemStyle"> ktdLinux联盟 <asp:TableItemStyle HorizontalAlign="Right"/> ktdLinux联盟 </property> ktdLinux联盟 </asp:TemplateColumn> ktdLinux联盟 </property> ktdLinux联盟 ... ktdLinux联盟 </asp:DataGrid> ktdLinux联盟 ktdLinux联盟 控件的声明展示将 TemplateColumn 添加到 Columns 集合,以替代价格字段的 BoundColumn。 TemplateColumns 是 DataGrid 的另一扩展机制。可以将其用于对 DataGrid 所创建的表格式布局内所表现的 UI 进行完全定制。 TemplateColumn 还提供模板属性,比如 ItemTemplate 和 EditItemTemplate,从而您可以指定应当用于与列相关联的单元格内的控件。 ktdLinux联盟 ktdLinux联盟 在本例中, ItemTemplate 包含一个 Label 控件,其 Text 属性绑定到价格字段。这实质上在模仿 BoundColumn 的功能。 ktdLinux联盟 ktdLinux联盟 有意思的是, EditItemTemplate 模板用于处于编辑模式中的单元格。样例将一个 TextBox 放入已绑定到价格字段的模板中。这样就提供了与 BoundColumn 相同的功能。 ktdLinux联盟 ktdLinux联盟 模板包含各种各样的增强性能。首先,该模板允许对 TextBox 进行更大的控制,从而您可以创建在视觉上更有魅力的编辑 UI。其次,允许您放置验证控件,从而可以进行原地验证。在本样例中, RequiredFieldValidator 确保 TextBox 总是包含一个值,而 RegularExpressionValidator 确保文本包含一个有效的货币值。该功能的最令人兴奋的一个方面就是自动进行客户机端验证。 ASP+ 验证控件自动进行客户机端验证,并开启功能丰富的浏览器客户机上的错误指示器,从而无须往返过程和回落到为下级客户机进行服务器端验证。
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |
|
|
|
|
|