前段時間筆者在開發中需要動態創建web組件,本以為是小事一樁,誰知看時容易做時難。里面還真有些小問題。下面筆者就結合自己的程序來介紹一下如何動態創建并使用web組件,希望能給做類似工作的朋友提供一點幫助。 
  一、程序思路 
  程序主要分三部分: 
  1、程序要根據xml中的數據信息確定需要創建的web組件的個數。 
  2、動態創建web組件。 
  3、使用動態創建的web組件。 
  其中2和3是筆者要重點介紹的部分。 
  下面筆者就按照這三部分結合程序實例(以c#為例)來一一介紹。 
  二、讀取xml文件 
  讀取xml文件在很多的資料中都有詳細的說明,而且相信很多朋友都已經很好的掌握了其技術。但為了保證文章的完整性,筆者在這里還是要贅述幾句。深諧其味的朋友可以略過此段不看。 
  筆者程序中要讀取的xml文件形如下列: 
  config.xml 
  <?xml version="1.0"?> 
  <root> 
  <nettype>net</nettype> 
  <totalnum>6</totalnum> 
  <cells>2</cells> 
  <iplink> 
  <name>站點1</name> 
  <ip>192.8.198.1</ip> 
  <sequence>1</sequence> 
  </iplink> 
  <iplink> 
  <name>站點2</name> 
  <ip>192.8.198.2</ip> 
  <sequence>2</sequence> 
  </iplink> 
  … … 
  </root> 
  讀取xml文件的程序如下: 
  protected void readconfig() 
  { 
  try 
  { 
  system.xml.xmldocument mxmldoc=new system.xml.xmldocument(); 
  mxmldoc.load(server.mappath(configfilepath)); 
  nettype=mxmldoc.selectnodes("http://root/nettype")[0].innertext; totalnum=int.parse(mxmldoc.selectnodes("http://root/totalnum")[0].innertext); 
  //讀出列數 
  cells=int.parse(mxmldoc.selectnodes("http://root/cells")[0].innertext); 
  xmlnodelist mxmlnodes=mxmldoc.selectnodes("http://root/iplink"); 
  foreach(xmlnode iplinkchildlnode in mxmlnodes) 
  { 
  //得到序列號 
  int icount=int.parse(iplinkchildlnode.childnodes[2].innertext); 
  //根據序列號,將測量點的名稱放入名稱數組相應的位置上 
  namestr[icount]=iplinkchildlnode.childnodes[0].innertext; 
  //根據序列號,將測量點的ip放入ip數組相應的位置上 
  ipstr[icount]=iplinkchildlnode.childnodes[1].innertext; 
  } 
  } 
  catch 
  { 
  errmessage.innerhtml="<table align=center><tr> 
  <td align=left><font color=red>不能讀取配置文件,可能的錯誤是<br>"+"1、配置文件不存在<br>"+ 
  "2、配置文件內容被損壞"+ 
  "</font></td></tr></table>"; 
  } 
  } 
  程序中對xml中無子節點的元素如: 
  <nettype>net</nettype> 
  直接使用如下語句讀取。 
  mxmldoc.selectnodes("http://root/nettype")[0].innertext; 
  對于有子節點的元素如: 
  <iplink> 
  <name>站點1</name> 
  <ip>192.8.198.1</ip> 
  <sequence>1</sequence> 
  </iplink> 
  要使用語句如下來讀取。 
  iplinkchildlnode.childnodes[n].innertext 
  其中 childnodes[n] 中的[n]為子節點的序號,子節點 
  <name>站點1</name> 
  的序號應該為[0]。
  三、動態創建web組件。 
  先來看程序實例: 
  private void createconfigtable(int totalnum,int[] sequenceint,string[] namestr,string[] ipstr) 
  { 
  //根據得到測量點的總數,動態生成輸入框 
  for(int i=1;i<=totalnum;i++) 
  { 
  //創建表格 
  htmltable showtable = new htmltable(); 
  showtable.border=0; 
  showtable.id="showtable"+i.tostring(); 
  showtable.bordercolor="#000000"; 
  showtable.cellpadding=4; 
  showtable.cellspacing=4; 
  showtable.align="center"; 
  myplaceholder.controls.add(showtable); 
  //創建一行 
  htmltablerow trow = new htmltablerow(); 
  showtable.rows.add(trow); 
  //創建第一列(序號) 
  htmltablecell tcell = new htmltablecell(); 
  label sequencelabel = new label(); 
  sequencelabel.id="sequencelabel"+i.tostring(); 
  sequencelabel.text="序號:"; 
  sequencelabel.enabled=true; 
  tcell.controls.add(sequencelabel); 
  trow.cells.add(tcell); 
  //創建第二列 
  tcell = new htmltablecell(); 
  sequencedatatb = new textbox(); 
  sequencedatatb.id="sequencedatatb"+i.tostring(); 
  sequencedatatb.text=i.tostring(); 
  sequencedatatb.width=30; 
  sequencedatatb.text=sequenceint[i].tostring(); 
  sequencedatatb.readonly=false; 
  //創建第三列(名稱) 
  tcell = new htmltablecell(); 
  label namelabel = new label(); 
  namelabel.id="namelabel"+i.tostring(); 
  namelabel.text="名稱:"; 
  namelabel.enabled=true; 
  tcell.controls.add(namelabel); 
  trow.cells.add(tcell); 
  //創建第四列 
  tcell = new htmltablecell(); 
  nametb=new textbox(); 
  nametb.id="nametb"+i.tostring(); 
  nametb.width=120; 
  nametb.text=namestr[i]; 
  nametb.maxlength=50; 
  tcell.controls.add(nametb); 
  trow.cells.add(tcell); 
  //創建第五列(ip) 
  tcell = new htmltablecell(); 
  label iplabel = new label(); 
  iplabel.id="iplabel"+i.tostring(); 
  iplabel.text="ip:"; 
  iplabel.enabled=true; 
  tcell.controls.add(iplabel); 
  trow.cells.add(tcell); 
  //創建第六列 
  tcell = new htmltablecell(); 
  iptb=new textbox(); 
  iptb.id="iptb"+i.tostring(); 
  iptb.width=120; 
  iptb.text=ipstr[i]; 
  iptb.maxlength=15; 
  tcell.controls.add(iptb); 
  trow.cells.add(tcell); 
  } 
  } 
  tcell.controls.add(sequencedatatb); 
  trow.cells.add(tcell); 
  … … 
  //創建第五列(ip) 
  tcell = new htmltablecell(); 
  label iplabel = new label(); 
  iplabel.id="iplabel"+i.tostring(); 
  iplabel.text="ip:"; 
  iplabel.enabled=true; 
  tcell.controls.add(iplabel); 
  trow.cells.add(tcell); 
  //創建第六列 
  tcell = new htmltablecell(); 
  iptb=new textbox(); 
  iptb.id="iptb"+i.tostring(); 
  iptb.width=120; 
  iptb.text=ipstr[i]; 
  iptb.maxlength=15; 
  tcell.controls.add(iptb); 
  trow.cells.add(tcell); 
  } 
  } 
  程序中的myplaceholder 是 system.web.ui.webcontrols.placeholder 組件,使用該組件的html語法如下: 
  … … 
  <tr> 
  <td> 
  <asp:placeholder id="myplaceholder" runat="server"></asp:placeholder> 
  </td> 
  </tr> 
  … … 
  使用該組件的目的是為了定位動態創建的表格。該組件在頁面上的位置即為動態創建的表格的位置。 
  程序中另外一個要說明的地方是動態創建的組件的id的設定。組件的id的設定要注意兩點: 
  1、id號不能重復 
  2、要便于在程序中使用。因為要在程序中使用動態創建的組件,要通過該組件的id來查找。(關于這一點,在“使用動態創建的web組件”部分會有較為詳細的介紹)
新聞熱點
疑難解答
圖片精選