ToB企服应用市场:ToB评测及商务社交产业平台

标题: C# Web控件与数据感应之 填充 HtmlTable [打印本页]

作者: 小小小幸运    时间: 2024-6-9 15:17
标题: C# Web控件与数据感应之 填充 HtmlTable
目录
关于 HtmlTable
HtmlTable与BaseDataList的区别
预备数据源
​范例运行情况
FillTable 方法
设计与实现
模板样例输出
Automatic 模式填充
​         DynamicRows 模式填充
StaticRows 模式填充

小结


关于 HtmlTable

数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,HtmlTable 控件表现为一个服务器控件,隶属于 System.Web.UI.HtmlControls 聚集,对于客户端输出即 table 标签元素,table 表格的告急作用就是数据输出 ,本文将先容 C# 实现操纵 HtmlTable 服务器控件实现数据集表数据的轻量化输出与显示。
HtmlTable与BaseDataList的区别

HtmlTable 与诸如 DataGrid、GridView 都可用于数据输出 ,告急区别在于:
(1)前者以属于System.Web.UI.HtmlControls 聚集,后者 Microsoft.Web.UI.WebControls 聚集
(2)HtmlTable 可实现 table 元素的一些操纵,如行、列、单位格及样式设置,而 BaseDataList 除可实现 HtmlTable 的根本控制外,还可以绑定命据源、绑定事件、绑定列控件等更加强大的功能。
(3)对于数据聚集访问 HtmlTable 通过 Rows ,列聚集为 Cells;而 BaseDataList  通过 Items ,列聚集为 Colums。
预备数据源

我们在 MS SQL Server 创建 pub_ChinaPay(付出状态代码表),其结构如下表:
序号字段名范例说明1valuechar(4)付出状态代码,唯一键2textnvarchar(14)状态名称3sortidsmallint排序号 实行如下 创建表的 SQL 语句:
  1. CREATE TABLE [dbo].[pub_ChinaPay](
  2.         [value] [char](4) NOT NULL,
  3.         [text] [nvarchar](14) NOT NULL,
  4.         [sortid] [smallint] NULL,
  5. CONSTRAINT [PK_pub_ChinaPay] PRIMARY KEY CLUSTERED
  6. (
  7.         [value] ASC
  8. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  9. ) ON [PRIMARY]
  10. GO
复制代码
实行如下SQL语句,创建一些数据:
  1. insert into pub_ChinaPay(value,text,sortid) values('****','默认状态',1)
  2. insert into pub_ChinaPay(value,text,sortid) values('    ','待支付',2)
  3. insert into pub_ChinaPay(value,text,sortid) values('1001','消费交易成功',3)
  4. insert into pub_ChinaPay(value,text,sortid) values('1003','退款提交成功',4)
  5. insert into pub_ChinaPay(value,text,sortid) values('1005','退款撤销成功',5)
  6. insert into pub_ChinaPay(value,text,sortid) values('0003','交易失败',6)
  7. insert into pub_ChinaPay(value,text,sortid) values('6666','微信退款申请成功',7)
复制代码
通过查询分析器,实行查询SQL语句,显示如下图:


末了我们将数据填充到 DataReader ,并天生对应的二维数组。


范例运行情况

操纵系统: Windows Server 2019 DataCenter
数据库:Microsoft SQL Server 2016
.net版本: .netFramework4.0 或以上
开发工具:VS2019  C#
FillTable 方法

设计与实现

FillTable 方法告急是通过 object[,] 二维对象数组数据源进行提取并呈如今 HtmlTable 表格控件上,其参数设置见下表:
序号参数名范例说明1tbSystem.Web.UI.HtmlControls.HtmlTable要输出的 HtmlTable 对象2ftFillType 填充模式罗列:
public enum FillType
 { Automatic,DynamicRows,
StaticRows
}
后续将解说这些模式的区别
3SpaceInEmptyCellbool对于空字符串输出,是否替换为&nbsp 输出以达到更好的显示效果4MinClearRowsCountint当输出数据举动空时,清除模板表格行的阀值,设为0,则表现全部清空,不显示输出表格的任何元素5refStartRowIdint指定命据输出的起始行6refCopyRowIdint指定要复制哪一行的格式进行输出7allowToHTMLbool是否允许将数据剖析为HTML样式输出,默以为 false GetReaderData 方法可以访问数据库数据表进行查询效果的提取,并转化为 object[,] 二维数组,其参数设置见下表:
序号参数名范例说明1DbServerTypestring目前支持 "oracle"、 "dm8",其它字符串均视为 MS SQL ServerstrConnstring对应数据库的连接字符串2_sqlstring要实行的SQL语句下令行3parasArrayList 要赋值的参数对象,逐个添加到ArrayList里,请留意参数为实体数据参数对象,如 MS SQL Server ,请传递如下代码:
ArrayList.Add(new SqlParameter("参数名",参数值)); 
4hastitlebool输出是否包含字段列标题5ctCommandType System.Data.CommandType 罗列,可包罗:
StoredProcedure(存储过程)
TableDirect(直接表查询)
Text(文本查询)该值为默认值
  GetReaderData 方法实当代码如下:
  1. int RowsCount = 0;
  2. int ErrorNum = 0;
  3. string ErrorMessage = "";
  4. public object[,] GetReaderData(string DbServerType,string strConn,string _sql,ArrayList paras,bool hastitle,CommandType ct)
  5. {
  6.                         if((DbServerType.ToLower()=="")||(DbServerType.ToLower()=="sqlserver"))
  7.                         {
  8.                                 SqlConnection Conn = new SqlConnection(strConn );
  9.                                 SqlCommand Cmd = new SqlCommand();
  10.                                 Cmd.CommandType=ct;
  11.                                 Cmd.Connection = Conn;
  12.                                 SqlDataReader myDr;
  13.                                 Cmd.CommandText =_sql;
  14.                                 if(paras!=null)
  15.                                 {
  16.                                         for(int i=0;i<paras.Count;i++)
  17.                                         {
  18.                                                 Cmd.Parameters.Add((SqlParameter)paras[i]);
  19.                                         }
  20.                                 }
  21.                                 try
  22.                                 {
  23.                                         Conn.Open();
  24.                                         myDr = Cmd.ExecuteReader();
  25.                                        
  26.                                         ArrayList rowdata = new ArrayList();
  27.                                         int _fieldcount=myDr.FieldCount;
  28.                                         Object[] colvalues = new Object[_fieldcount];
  29.                                         for(int i=0;i<_fieldcount;i++)
  30.                                         {
  31.                                                 colvalues[i]=myDr.GetName(i);
  32.                                         }
  33.                                         if(hastitle)
  34.                                         rowdata.Add(colvalues);
  35.                                         while(myDr.Read())
  36.                                         {
  37.                                                 Object[] values = new Object[_fieldcount];
  38.                                                 myDr.GetValues(values);
  39.                                                 rowdata.Add(values);
  40.                                                 RowsCount++;
  41.                                         }
  42.                                         myDr.Close();
  43.                                         object[,] rv=new object[rowdata.Count,_fieldcount];
  44.                                         for(int i=0;i<rowdata.Count;i++)
  45.                                         {
  46.                                                 for(int j=0;j<_fieldcount;j++)
  47.                                                 {
  48.                                                         rv[i,j]=((object[])rowdata[i])[j];
  49.                                                 }
  50.                                         }
  51.                                         return rv;
  52.                                 }
  53.                                 catch (SqlException e)
  54.                                 {
  55.                                         ErrorMessage=e.Message;
  56.                                         return null;
  57.                                 }
  58.                                 finally
  59.                                 {
  60.                                         Conn.Close();
  61.                                         Conn.Dispose();
  62.                                 }
  63.                         }//sqlserver
  64.                         if(DbServerType.ToLower()=="oracle")
  65.                         {
  66.                                 OracleConnection Conn = new OracleConnection(strConn );
  67.                                 OracleCommand Cmd = new OracleCommand();
  68.                                 Cmd.Connection = Conn;
  69.                                 OracleDataReader myDr;
  70.                                 Cmd.CommandText =_sql;
  71.                                 if(paras!=null)
  72.                                 {
  73.                                         for(int i=0;i<paras.Count;i++)
  74.                                         {
  75.                                                 Cmd.Parameters.Add((OracleParameter)paras[i]);
  76.                                         }
  77.                                 }
  78.                                 try
  79.                                 {
  80.                                         Conn.Open();
  81.                                         myDr = Cmd.ExecuteReader();
  82.                                         ArrayList rowdata = new ArrayList();
  83.                                         int _fieldcount=myDr.FieldCount;
  84.                                         Object[] colvalues = new Object[_fieldcount];
  85.                                         for(int i=0;i<_fieldcount;i++)
  86.                                         {
  87.                                                 colvalues[i]=myDr.GetName(i);
  88.                                         }
  89.                                         if(hastitle)
  90.                                                 rowdata.Add(colvalues);
  91.                                         while(myDr.Read())
  92.                                         {
  93.                                                 Object[] values = new Object[_fieldcount];
  94.                                                 myDr.GetValues(values);
  95.                                                 rowdata.Add(values);
  96.                                                 RowsCount++;
  97.                                         }
  98.                                         myDr.Close();
  99.                                         object[,] rv=new object[rowdata.Count,_fieldcount];
  100.                                         for(int i=0;i<rowdata.Count;i++)
  101.                                         {
  102.                                                 for(int j=0;j<_fieldcount;j++)
  103.                                                 {
  104.                                                         rv[i,j]=((object[])rowdata[i])[j];
  105.                                                 }
  106.                                         }
  107.                                         return rv;
  108.                                 }
  109.                                 catch (OracleException e)
  110.                                 {
  111.                                         ErrorMessage=e.Message;
  112.                                         return null;
  113.                                 }
  114.                                 finally
  115.                                 {
  116.                                         Conn.Close();
  117.                                         Conn.Dispose();
  118.                                 }
  119.                         }//oracle
  120.             if (DbServerType.ToLower() == "dm8")
  121.             {
  122.                 DmConnection Conn = new DmConnection(strConn);
  123.                 DmCommand Cmd = new DmCommand();
  124.                 Cmd.CommandType = ct;
  125.                 Cmd.Connection = Conn;
  126.                 DmDataReader myDr;
  127.                 Cmd.CommandText = _sql;
  128.                 if (paras != null)
  129.                 {
  130.                     for (int i = 0; i < paras.Count; i++)
  131.                     {
  132.                         Cmd.Parameters.Add((DmParameter)paras[i]);
  133.                     }
  134.                 }
  135.                 try
  136.                 {
  137.                     Conn.Open();
  138.                     myDr = Cmd.ExecuteReader() as DmDataReader;
  139.                     ArrayList rowdata = new ArrayList();
  140.                     int _fieldcount = myDr.FieldCount;
  141.                     Object[] colvalues = new Object[_fieldcount];
  142.                     for (int i = 0; i < _fieldcount; i++)
  143.                     {
  144.                         colvalues[i] = myDr.GetName(i);
  145.                     }
  146.                     if (hastitle)
  147.                         rowdata.Add(colvalues);
  148.                     while (myDr.Read())
  149.                     {
  150.                         Object[] values = new Object[_fieldcount];
  151.                         myDr.GetValues(values);
  152.                         rowdata.Add(values);
  153.                         RowsCount++;
  154.                     }
  155.                     myDr.Close();
  156.                     object[,] rv = new object[rowdata.Count, _fieldcount];
  157.                     for (int i = 0; i < rowdata.Count; i++)
  158.                     {
  159.                         for (int j = 0; j < _fieldcount; j++)
  160.                         {
  161.                             rv[i, j] = ((object[])rowdata[i])[j];
  162.                         }
  163.                     }
  164.                     return rv;
  165.                 }
  166.                 catch (DmException e)
  167.                 {
  168.                     ErrorMessage = e.Message;
  169.                     return null;
  170.                 }
  171.                 finally
  172.                 {
  173.                     Conn.Close();
  174.                     Conn.Dispose();
  175.                 }
  176.             }//dm8
  177.             return null;
  178. }//getreaddata
复制代码

FillTable 方法实当代码如下:
  1. ArrayList paras=new ArrayList();
  2. string refSql="";
  3. bool hastitle=false;
  4. System.Data.CommandType ct=System.Data.CommandType.Text;
  5. public void FillTable(HtmlTable tb, FillType ft, bool SpaceInEmptyCell, int MinClearRowsCount, int refStartRowId,int refCopyRowId,bool allowToHTML)
  6. {
  7.       object[,] ReaderData = GetReaderData("SqlServer","您的连接串","",paras,hastitle,ct);
  8.                 if (ReaderData == null && RowsCount==0)
  9.                 {
  10.                     while (tb.Rows.Count > MinClearRowsCount)
  11.                     {
  12.                         tb.Rows.RemoveAt(tb.Rows.Count - 1);
  13.                     }
  14.                     return;
  15.                 }
  16.                 if (ft == FillType.Automatic || ft==FillType.DynamicRows || ft==FillType.StaticRows)
  17.                 {
  18.                     if (ft == FillType.Automatic)
  19.                     {
  20.                         int addcells = ReaderData.GetLength(1) - tb.Rows[0].Cells.Count;
  21.                         for (int i = 0; i < tb.Rows.Count; i++)
  22.                         {
  23.                             for (int j = 0; j < addcells; j++)
  24.                             {
  25.                                 HtmlTableCell tc = new HtmlTableCell();
  26.                                 if (allowToHTML == true)
  27.                                 {
  28.                                     tc.Attributes.Add("ByHTML", "true");
  29.                                 }
  30.                                 tb.Rows[i].Cells.Add(tc);
  31.                             }
  32.                         }
  33.                         if (tb.Rows.Count == 2)
  34.                         {
  35.                             for (int j = 0; j < ReaderData.GetLength(1); j++)
  36.                             {
  37.                                 string _fieldname = ReaderData[0, j].ToString();
  38.                                 tb.Rows[0].Cells[j].InnerText = _fieldname;
  39.                             }
  40.                         }
  41.                     }
  42.                     int startRowID = tb.Rows.Count - 1;
  43.                     int copyRowID = 0;
  44.                     if (ft == FillType.StaticRows)
  45.                     {
  46.                         if (HasTitle == true)
  47.                         {
  48.                             startRowID = tb.Rows.Count > 1 ? 1 : 0;
  49.                         }
  50.                         else
  51.                         {
  52.                             startRowID = 0;
  53.                         }
  54.                     }
  55.                     if (refStartRowId != -1) startRowID = refStartRowId;
  56.                     if (refCopyRowId != -1) copyRowID = refCopyRowId;
  57.                     for (int i = (HasTitle == true ? 1 : 0); i < ReaderData.GetLength(0); i++)
  58.                     {
  59.                         if (startRowID>tb.Rows.Count-1) break;
  60.                         for (int j = 0; j < ReaderData.GetLength(1); j++)
  61.                         {
  62.                             if (j > tb.Rows[copyRowID].Cells.Count - 1) break;
  63.                             HtmlTableCell td = tb.Rows[startRowID].Cells[j];
  64.                             if (td.Attributes["ByHTML"] == null)
  65.                             {
  66.                                 td.InnerText = ReaderData[i, j].ToString();
  67.                             }
  68.                             else
  69.                             {
  70.                                 td.InnerHtml = allowToHTML == true ? (ReaderData[i, j].ToString()) : ReaderData[i, j].ToString();;
  71.                             }
  72.                            
  73.                             if (td.InnerText == "" && SpaceInEmptyCell == true) td.InnerHtml="&nbsp;";
  74.                         }
  75.                         if (i == ReaderData.GetLength(0)-1) break;
  76.                         if (ft == FillType.Automatic || ft == FillType.DynamicRows)
  77.                         {
  78.                             HtmlTableRow tr = new HtmlTableRow();
  79.                             tb.Rows.Add(tr);
  80.                             for (int k = 0; k < tb.Rows[copyRowID].Cells.Count; k++)
  81.                             {
  82.                                 HtmlTableCell prv_tc = tb.Rows[startRowID].Cells[k];
  83.                                 HtmlTableCell tc = new HtmlTableCell();
  84.                                 tr.Cells.Add(tc);
  85.                                 CloneStyles(prv_tc, tc);
  86.                             }
  87.                         }
  88.                         startRowID ++;
  89.                     }
  90.                 }
  91. }//fill table
  92. void CloneStyles(HtmlControl obj, HtmlControl newobj)
  93. {
  94.                 IEnumerator keys = obj.Style.Keys.GetEnumerator();
  95.                 while (keys.MoveNext())
  96.                 {
  97.                     String key = (String)keys.Current; newobj.Style[key] = obj.Style[key];
  98.                 }
  99.                 IEnumerator keys2 = obj.Attributes.Keys.GetEnumerator();
  100.                 while (keys2.MoveNext())
  101.                 {
  102.                     String key = (String)keys2.Current; newobj.Attributes[key] = obj.Attributes[key];
  103.                 }
  104. }
复制代码
模板样例输出

在方法设计的章节里先容了 FillType (即填充范例的罗列)
Automatic 模式填充

全自动填充,表现行、列均不固定,全由SQL查询效果动态输出,仅设置首行首列的样式即可,如下图:

 前端代码示例 :
  1. <table id="tjTable" runat="server" align="center" border="1" style="width: 700px; border:1px solid #000000;border-collapse:collapse">
  2.         <tr><td>标题</td></tr>
  3.         <tr>
  4.             <td>
  5.                 &nbsp;</td>
  6.          </tr>
  7. </table>
复制代码
调用示例如下代码:
  1. string refSQL = "select value,text,sortid from pub_chinaPay order by sortid";
  2. FillTable(tjTable, FillType.Automatic, true, 0, 1, 1);
复制代码
输出效果如下图 

可以看到行列完全由SQL语句决定进行原始输出,行与列均为动态输出 。 


DynamicRows 模式填充

动态行填充,表现行输出不固定,已预知列的输出,仅需要设置首行标题列和数据行的样式即可,如下图:

 前端代码示例 :
  1. <table id="tjTable" runat="server" align="center" border="1" style="width: 700px; border:1px solid #000000;border-collapse:collapse">
  2.         <tr>
  3.             <td>
  4.                状态代码</td>
  5.             <td>
  6.                状态名称</td>
  7.             <td>
  8.                排序号</td>
  9.         </tr>
  10.         <tr>
  11.             <td>
  12.                 &nbsp;</td>
  13.             <td>
  14.                 &nbsp;</td>
  15.             <td>
  16.                 &nbsp;</td>
  17.         </tr>
  18.     </table>
复制代码
调用示例如下代码:
  1. string refSQL = "select value,text,sortid from pub_chinaPay order by sortid";
  2. FillTable(tjTable, FillType.DynamicRows, true, 0, 1, 1);
复制代码
输出效果如下图 

可以看到举动动态输出,标题列为预期的设置 。 
StaticRows 模式填充

静态填充,表现行、列均固定,由SQL查询效果根据预设输出,可设置每行每列的样式,如下图:

 前端代码示例 :
  1. <table id="tjTable" runat="server" align="center" border="1" style="width: 700px; border:1px solid #000000;border-collapse:collapse">
  2.         <tr>
  3.             <td>
  4.                状态代码</td>
  5.             <td>
  6.                状态名称</td>
  7.             <td>
  8.                排序号</td>
  9.         </tr>
  10.         <tr>
  11.             <td>
  12.                 &nbsp;</td>
  13.             <td>
  14.                 &nbsp;</td>
  15.             <td>
  16.                 &nbsp;</td>
  17.         </tr>
  18.         <tr>
  19.             <td>
  20.                 &nbsp;</td>
  21.             <td>
  22.                 &nbsp;</td>
  23.             <td>
  24.                 &nbsp;</td>
  25.         </tr>
  26.         <tr>
  27.             <td>
  28.                 &nbsp;</td>
  29.             <td>
  30.                 &nbsp;</td>
  31.             <td>
  32.                 &nbsp;</td>
  33.         </tr>
  34.         <tr>
  35.             <td>
  36.                 &nbsp;</td>
  37.             <td>
  38.                 &nbsp;</td>
  39.             <td>
  40.                 &nbsp;</td>
  41.         </tr>
  42.         <tr>
  43.             <td>
  44.                 &nbsp;</td>
  45.             <td>
  46.                 &nbsp;</td>
  47.             <td>
  48.                 &nbsp;</td>
  49.         </tr>
  50.         <tr>
  51.             <td>
  52.                 &nbsp;</td>
  53.             <td>
  54.                 &nbsp;</td>
  55.             <td>
  56.                 &nbsp;</td>
  57.         </tr>
  58.         <tr>
  59.             <td>
  60.                 &nbsp;</td>
  61.             <td>
  62.                 &nbsp;</td>
  63.             <td>
  64.                 &nbsp;</td>
  65.         </tr>
  66.         <tr>
  67.             <td>
  68.                 &nbsp;</td>
  69.             <td>
  70.                 &nbsp;</td>
  71.             <td>
  72.                 &nbsp;</td>
  73.         </tr>
  74.     </table>
复制代码
调用示例如下代码:
  1. string refSQL = "select value,text,sortid from pub_chinaPay order by sortid";
  2. FillTable(tjTable,FillType.StaticRows, true, 0, 1, 1);
复制代码
输出效果如下图 

可以看到行有冗余,因此静态行模式仅输出列和行的可见区域,即溢出和不足均不显示 。 


小结

关于 HtmlTable 的其它详细操纵和先容,可参照如下链接:
https://learn.microsoft.com/zh-cn/dotnet/api/system.web.ui.htmlcontrols.htmltable?view=netframework-4.8.1&redirectedfrom=MSDN
关于填充模式,是在实际的应用场景里进行输出 ,好比全动态适合于依赖SQL语句控制度较高的场景,而动态行则是比较常见的一种输出方式,静态行输出则好比我们提供一种填写表格,已经预设好最大行数,为体现整体统一的输出风格而应用。所以,我们可以根据自己的实际需要改造输出 的模式,本示例代码仅供您参考。 
感谢您的阅读,希望本文能够对您有所帮助。




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4