熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Asp.NET自定義DataGrid控件

2022-06-13   來源: .NET編程 

  一             給控件提供支持綁定數據源的功能

  要實現很簡單只有從新類 CompositeDataBoundControl 派生並實現CreateChildControls方法就可以了

  

  先做一個簡單的例子理解一下這個類的使用

  代碼

  using System;

  using SystemCollections;

  using SystemCollectionsGeneric;

  using SystemWeb;

  using SystemWebUI;

  using SystemWebUIWebControls;

  namespace XLSoftWebControls

  {

  public class MyDataGrid : CompositeDataBoundControl

  {

  public string DataName

  {

  get

  {

  object o = ViewState[DataName];

  if (o == null)

  return ;

  return (string)o;

  }

  set { ViewState[DataName] = value; }

  }

  protected override int CreateChildControls(IEnumerable dataSource bool dataBinding)

  {

  int itemCount = ;

  if (dataBinding)

  {

  foreach (object obj in dataSource)

  {

  Label lbl = new Label();

  lblText = DataBinderGetPropertyValue(obj DataName)ToString() + | ;

  ControlsAdd(lbl);

  itemCount++;

  }

  }

  return itemCount;

  }

  }

  }

  <MYUI:MyDataGrid ID=MyDataGrid runat=server DataName=text />

  代碼

  protected void Page_Load(object sender EventArgs e)

  {

  DataTable dt = new DataTable();

  dtColumnsAdd(text);

  DataRow dr = dtNewRow();

  dr[] = ;

  DataRow dr = dtNewRow();

  dr[] = ;

  dtRowsAdd(dr);

  dtRowsAdd(dr);

  thisMyDataGridDataSource = dt;

  thisMyDataGridDataBind()

  }

  二             添加多列的屬性

  上面的實驗只是做了實現數據源控件的功能如果是要做表格控件其中的label就可以換成TableRow 並添加到Table這樣同樣可以做出表格不過只有一列(DataName)當然可以把多個列名合並放在DataName中考慮到列可能會有其他屬性比如HeaderText這樣做並不合理於是換成 Colunms集合對象

  代碼

  public class MyColunm

  {

  public MyColunm() { }

  public MyColunm(string name string headertext string format)

  {

  this_name = name;

  this_headerText = headertext;

  this_format = format;

  }

  private string _name;

  private string _headerText;

  private string _format;

  public string Format

  {

  get { return _format; }

  set{ _format = value; }

  }

  public string HeaderText

  {

  get { return _headerText; }

  set { _headerText = value; }

  }

  public string Name

  {

  get { return _name; }

  set { _name = value; }

  }

  }

  public class MyColunmCollection : List<MyColunm>{}

  public class MyDataGrid : CompositeDataBoundControl

  {

  private MyColunmCollection _colunms = new MyColunmCollection();

  public MyColunmCollection Colunms

  {

  get { return _colunms; }

  }

  protected override int CreateChildControls(IEnumerable dataSource bool dataBinding)

  {

  Table table = new Table();

  if (dataBinding)

  {

  TableHeaderRow trHeader = new TableHeaderRow();

  foreach (MyColunm col in Colunms)

  {

  TableHeaderCell cell = new TableHeaderCell();

  cellText = colHeaderText;

  trHeaderCellsAdd(cell);

  }

  tableRowsAdd(trHeader); //Add Header Row

  foreach (object obj in dataSource)

  {

  TableRow tr = new TableRow();

  foreach (MyColunm col in Colunms)

  {

  TableCell cell = new TableCell();

  if (stringIsNullOrEmpty(colFormat))

  cellText = DataBinderGetPropertyValue(obj colName)ToString();

  else

  cellText = DataBinderGetPropertyValue(obj colName colFormat);

  trCellsAdd(cell);

  }

  tableRowsAdd(tr);

  }

  }

  ControlsAdd(table);

  return ;

  }

  }

  三添加子標簽

  簡單來說添加特性ParseChildren(trueColunms)就可以把子標簽作為屬性填充到Colunms中

  

  關於ParseChildrenMSDN有這樣的解釋:

  :在開發ASPNET 服務器控件時ParseChildrenAttribute 類指示頁分析器應如何處理頁上聲明的服務器控件標記中嵌套的內容

  :ParseChildrenAttribute 類允許您以 ParseChildrenAttribute 元數據屬性標記服務器控件來為自定義服務器控件指定分析邏輯

  :以元數據屬性 (Attribute) ParseChildren(true) 標記服務器控件將指示分析器把包含在服務器控件標記內的元素解釋為屬性 (Property)

  :以元數據屬性 (Attribute) ParseChildren(true<Default Property>) 標記服務器控件將把 DefaultProperty 屬性 (Property) 設置為傳遞到該屬性 (Attribute) 的屬性 (Property) 名稱

  :以元數據屬性 ParseChildren(false)(默認值)標記服務器控件將指示分析器把包含在服務器控件標記中的元素解釋為將通過關聯的 ControlBuilder 進行分析的內容即解釋為控件


From:http://tw.wingwit.com/Article/program/net/201311/11912.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.