快速业务通道

ASP.NET自定义控件 第二天 带有自定义样式的星级控件

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

ASP.NET自定义控件 第二天 带有自定义样式的星级控件

这里使用了System.Web.UI.Pair类用于保存两个相关的对象,与此类 似的还是System.Web.UI.Triplet类,用于保存三个相关的对象。需要保存更多的 数据时,可以考虑定义一个数组。

5. 实现IStateManager接口LoadViewState方法,从保存的视图数据中恢复必 要的设置:

void IStateManager.LoadViewState(object savedState)
{
  if (savedState != null)
  {
    Pair p = (Pair)savedState;
  
    base.LoadViewState(p.First);
  
    _displayTextAtBottom = Convert.ToBoolean(p.Second);
  }
}

ASP.NET自定义控件 第二天 带有自定义样式的星级控件

可以看到TextItemStyle中对接口的实现是通过接口名称.成员名称实 现的,即所谓的显式继承,采用这种继承方向,不能直接通过类调用接口方法, 而必须将类转换为接口类型后方可调用。

6. 在Start类中添加样式属性,并调用接口方法进行视图操作:

private TextItemStyle _textStyle;

[PersistenceMode(PersistenceMode.InnerProperty)]
public TextItemStyle TextStyle
{
  get
  {
    if (_textStyle == null)
      _textStyle = new TextItemStyle();
  
    if (IsTrackingViewState)
      ((IStateManager)_textStyle).TrackViewState();
  
    return _textStyle;
  }
  set
  {
    _textStyle = value;
  }
}

该属性使用PersitenceMode标识,该类只是通知Visual Studio 2005,使用 aspx源文件中的一个嵌入标记来永久存储该风格的内容。

7. 修改CreateControlHierarchy方法,根据样式属性设置决定是否创建新行 :

protected virtual void CreateControlHierarchy()
{
  Table table = new Table();
  TableRow row = new TableRow();
  table.Rows.Add(row);
  
  TableCell stars = new TableCell();
  CreateStars(stars);
  
  TableCell comment = new TableCell();
  CreateComment(comment);
  
  if (TextStyle.DisplayTextAtBottom)
  {
    row.Cells.Add(stars);
  
    TableRow text = new TableRow();
    text.Cells.Add(comment);
    table.Rows.Add(text);
  }
  else
  {       
    row.Cells.Add(comment);
  
    row.Cells.Add(stars);
  }
  
  this.Controls.Add(table);
}

8. 最后修改呈现方法PrepareControlForRender,将样式应用到文字单元格上 :

private void PrepareControlForReader()
{
  if (this.Controls.Count < 1)
    return;
  
  Table table = (Table)this.Controls[0];
  
  table.CellSpacing = 0;
  table.CellPadding = 0;
  
  TableCell cell = null;
  
  if (TextStyle.DisplayTextAtBottom)
  {
    cell = table.Rows[1].Cells[0];
  }
  else
  {
    cell = table.Rows[0].Ce
								
                                
kViewState方法 ,由于在这两个成员里不需要额外的动作,所以只需要简单的访问父类成员即可 :

bool IStateManager.IsTrackingViewState
{
  get
  {
    return base.IsTrackingViewState;
  }
}
  
void IStateManager.TrackViewState()
{
  base.TrackViewState();
}

4. 实现IStateManager接口SaveViewState方法以保存自定义属性:

object IStateManager.SaveViewState()
{
  Pair p = new Pair();
  p.First=base.SaveViewState();
  p.Second = _displayTextAtBottom;
  
  return p;
}

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号