使用 ASP+ DataGrid 控件来创建主视图/详细资料视图 (2)__教程 |
|
日期:2007-5-20 1:22:41 人气:84 [大 中 小] |
|
|
|
图 9. 完成第 8 步后的页面
Titles DataGrid 以及 ImageColumn 的声明来自:
Step8.aspx:Step8.aspx:
<%@ Register TagPrefix="s" Namespace="Samples"%> ... <asp:DataGrid id="titlesGrid" runat="server" ...>
<property name="Columns"> <s:ImageColumn ImageField="title_id" ImageFormatString="images/Title-{0}.gif"/> </property> ... </asp:DataGrid>
本页面包含一个寄存器指令,用于映射 <s:ImageColumn> 标记,以表示 Samples.ImageColumn 类。
DataGrid 的声明展示添加到 DataGrid 的 Columns 集合的 ImageColumn。 还展示 ImageField 和 ImageFormatString 集,因而图象是以包含与特定行相关联的标题 ID 的 URL 为依据的。其工作原理与第 2 步中所使用的 HyperLinkColumn 十分类似。
ImageColumn.cs:
namespace Samples { ...
public class ImageColumn : Column {
private PropertyDescriptor imageFieldDesc;
public ImageColumn() { }
public string ImageField { get { object o = State["ImageField"]; return (o != null) ? (string)o : String.Empty; } set { State["ImageField"] = value; } }
public string ImageFormatString { get { object o = State["ImageFormatString"]; return (o != null) ? (string)o : String.Empty; } set { State["ImageFormatString"] = value; } }
// 在与该列相关联的单元格中创建 // 控件 public override void InitializeCell(TableCell cell, int columnIndex, ListItemType itemType) { base.InitializeCell(cell, columnIndex, itemType);
if ((itemType == ListItemType.Item) || (itemType == ListItemType.AlternatingItem) || (itemType == ListItemType.SelectedItem) || (itemType == ListItemType.EditItem)) { Image image = new Image(); image.ID = Column.GetColumnControlID(columnIndex, -1); cell.Controls.Add(image);
if (ImageField.Length != 0) { image.AddOnDataBind(new EventHandler(this.OnDataBindColumn)); } } }
// 将数据载入在 InitializeCell 中创建的控件 private void OnDataBindColumn(object sender, EventArgs e) { Image boundImage = (Image)sender; DataGridItem item = (DataGridItem)boundImage.NamingContainer; object dataItem = item.DataItem;
if (IsFirstDataBind()) { string imageField = ImageField; imageFieldDesc = TypeDescriptor.GetProperties(dataItem)[imageField];
if (imageFieldDesc == null) { throw new Exception("Invalid property: '" + imageField + "'"); } OnFirstDataBindHandled(); }
object data = imageFieldDesc.GetValue(dataItem);
if (data != null) { string format = ImageFormatString;
if (format.Length != 0) { boundImage.ImageUrl = String.Format(format, data); } else { boundImage.ImageUrl = data.ToString(); } } } } }
DataGrid 控件所使用的每一列均由抽象的 Column 类派生而来。 列类型实施各种各样的属性 (诸如 HeaderText) 以及所有列类型所公用的样式。
ImageColumn 类用于添加针对其具体功能的属性,诸如 ImageField 和 ImageFormatString 属性。实施这些属性,是通过将各值存入列的 State 中实现的。列的状态,在 DataGrid 控件的往返过程中自动得到保持。 |
|
出处:本站原创 作者:佚名 |
|
|