小小小幸运 发表于 2024-6-9 15:17:50

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 语句:
CREATE TABLE .(
        (4) NOT NULL,
        (14) NOT NULL,
        NULL,
CONSTRAINT PRIMARY KEY CLUSTERED
(
        ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON
) ON
GO 实行如下SQL语句,创建一些数据:
insert into pub_ChinaPay(value,text,sortid) values('****','默认状态',1)
insert into pub_ChinaPay(value,text,sortid) values('    ','待支付',2)
insert into pub_ChinaPay(value,text,sortid) values('1001','消费交易成功',3)
insert into pub_ChinaPay(value,text,sortid) values('1003','退款提交成功',4)
insert into pub_ChinaPay(value,text,sortid) values('1005','退款撤销成功',5)
insert into pub_ChinaPay(value,text,sortid) values('0003','交易失败',6)
insert into pub_ChinaPay(value,text,sortid) values('6666','微信退款申请成功',7) 通过查询分析器,实行查询SQL语句,显示如下图:
https://img-blog.csdnimg.cn/direct/c01f79d0e2e14124ae270823163cdfb9.png​

末了我们将数据填充到 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 方法实当代码如下:
int RowsCount = 0;
int ErrorNum = 0;
string ErrorMessage = "";

public object[,] GetReaderData(string DbServerType,string strConn,string _sql,ArrayList paras,bool hastitle,CommandType ct)
{


                        if((DbServerType.ToLower()=="")||(DbServerType.ToLower()=="sqlserver"))
                        {

                                SqlConnection Conn = new SqlConnection(strConn );
                                SqlCommand Cmd = new SqlCommand();
                                Cmd.CommandType=ct;
                                Cmd.Connection = Conn;

                                SqlDataReader myDr;
                                Cmd.CommandText =_sql;
                                if(paras!=null)
                                {
                                        for(int i=0;i<paras.Count;i++)
                                        {
                                                Cmd.Parameters.Add((SqlParameter)paras);
                                        }
                                }


                                try
                                {
                                        Conn.Open();

                                        myDr = Cmd.ExecuteReader();
                                       
                                        ArrayList rowdata = new ArrayList();
                                        int _fieldcount=myDr.FieldCount;
                                        Object[] colvalues = new Object;
                                        for(int i=0;i<_fieldcount;i++)
                                        {
                                                colvalues=myDr.GetName(i);
                                        }
                                        if(hastitle)
                                        rowdata.Add(colvalues);
                                        while(myDr.Read())
                                        {
                                                Object[] values = new Object;
                                                myDr.GetValues(values);
                                                rowdata.Add(values);
                                                RowsCount++;
                                        }
                                        myDr.Close();
                                        object[,] rv=new object;
                                        for(int i=0;i<rowdata.Count;i++)
                                        {
                                                for(int j=0;j<_fieldcount;j++)
                                                {
                                                        rv=((object[])rowdata);
                                                }
                                        }
                                        return rv;

                                }

                                catch (SqlException e)
                                {
                                        ErrorMessage=e.Message;
                                        return null;
                                }

                                finally
                                {
                                        Conn.Close();
                                        Conn.Dispose();
                                }
                        }//sqlserver
                        if(DbServerType.ToLower()=="oracle")
                        {

                                OracleConnection Conn = new OracleConnection(strConn );
                                OracleCommand Cmd = new OracleCommand();

                                Cmd.Connection = Conn;

                                OracleDataReader myDr;
                                Cmd.CommandText =_sql;
                                if(paras!=null)
                                {
                                        for(int i=0;i<paras.Count;i++)
                                        {
                                                Cmd.Parameters.Add((OracleParameter)paras);
                                        }
                                }


                                try
                                {
                                        Conn.Open();

                                        myDr = Cmd.ExecuteReader();
                                        ArrayList rowdata = new ArrayList();
                                        int _fieldcount=myDr.FieldCount;
                                        Object[] colvalues = new Object;
                                        for(int i=0;i<_fieldcount;i++)
                                        {
                                                colvalues=myDr.GetName(i);
                                        }
                                        if(hastitle)
                                                rowdata.Add(colvalues);
                                        while(myDr.Read())
                                        {
                                                Object[] values = new Object;
                                                myDr.GetValues(values);
                                                rowdata.Add(values);
                                                RowsCount++;
                                        }
                                        myDr.Close();
                                        object[,] rv=new object;
                                        for(int i=0;i<rowdata.Count;i++)
                                        {
                                                for(int j=0;j<_fieldcount;j++)
                                                {
                                                        rv=((object[])rowdata);
                                                }
                                        }
                                        return rv;

                                }

                                catch (OracleException e)
                                {
                                        ErrorMessage=e.Message;
                                        return null;
                                }

                                finally
                                {
                                        Conn.Close();
                                        Conn.Dispose();
                                }
                        }//oracle
            if (DbServerType.ToLower() == "dm8")
            {

                DmConnection Conn = new DmConnection(strConn);
                DmCommand Cmd = new DmCommand();
                Cmd.CommandType = ct;
                Cmd.Connection = Conn;

                DmDataReader myDr;
                Cmd.CommandText = _sql;
                if (paras != null)
                {
                  for (int i = 0; i < paras.Count; i++)
                  {
                        Cmd.Parameters.Add((DmParameter)paras);
                  }
                }


                try
                {
                  Conn.Open();

                  myDr = Cmd.ExecuteReader() as DmDataReader;

                  ArrayList rowdata = new ArrayList();
                  int _fieldcount = myDr.FieldCount;
                  Object[] colvalues = new Object;
                  for (int i = 0; i < _fieldcount; i++)
                  {
                        colvalues = myDr.GetName(i);
                  }
                  if (hastitle)
                        rowdata.Add(colvalues);
                  while (myDr.Read())
                  {
                        Object[] values = new Object;
                        myDr.GetValues(values);
                        rowdata.Add(values);
                        RowsCount++;
                  }
                  myDr.Close();
                  object[,] rv = new object;
                  for (int i = 0; i < rowdata.Count; i++)
                  {
                        for (int j = 0; j < _fieldcount; j++)
                        {
                            rv = ((object[])rowdata);
                        }
                  }
                  return rv;

                }

                catch (DmException e)
                {
                  ErrorMessage = e.Message;
                  return null;
                }

                finally
                {
                  Conn.Close();
                  Conn.Dispose();
                }
            }//dm8
            return null;
}//getreaddata

FillTable 方法实当代码如下:
ArrayList paras=new ArrayList();
string refSql="";
bool hastitle=false;
System.Data.CommandType ct=System.Data.CommandType.Text;
public void FillTable(HtmlTable tb, FillType ft, bool SpaceInEmptyCell, int MinClearRowsCount, int refStartRowId,int refCopyRowId,bool allowToHTML)
{
      object[,] ReaderData = GetReaderData("SqlServer","您的连接串","",paras,hastitle,ct);

                if (ReaderData == null && RowsCount==0)
                {
                  while (tb.Rows.Count > MinClearRowsCount)
                  {
                        tb.Rows.RemoveAt(tb.Rows.Count - 1);
                  }

                  return;
                }
                if (ft == FillType.Automatic || ft==FillType.DynamicRows || ft==FillType.StaticRows)
                {
                  if (ft == FillType.Automatic)
                  {
                        int addcells = ReaderData.GetLength(1) - tb.Rows.Cells.Count;
                        for (int i = 0; i < tb.Rows.Count; i++)
                        {
                            for (int j = 0; j < addcells; j++)
                            {
                              HtmlTableCell tc = new HtmlTableCell();
                              if (allowToHTML == true)
                              {
                                    tc.Attributes.Add("ByHTML", "true");
                              }
                              tb.Rows.Cells.Add(tc);
                            }
                        }
                        if (tb.Rows.Count == 2)
                        {
                            for (int j = 0; j < ReaderData.GetLength(1); j++)
                            {
                              string _fieldname = ReaderData.ToString();
                              tb.Rows.Cells.InnerText = _fieldname;
                            }
                        }
                  }
                  int startRowID = tb.Rows.Count - 1;
                  int copyRowID = 0;
                  if (ft == FillType.StaticRows)
                  {
                        if (HasTitle == true)
                        {
                            startRowID = tb.Rows.Count > 1 ? 1 : 0;
                        }
                        else
                        {
                            startRowID = 0;
                        }
                  }
                  if (refStartRowId != -1) startRowID = refStartRowId;
                  if (refCopyRowId != -1) copyRowID = refCopyRowId;
                  for (int i = (HasTitle == true ? 1 : 0); i < ReaderData.GetLength(0); i++)
                  {
                        if (startRowID>tb.Rows.Count-1) break;
                        for (int j = 0; j < ReaderData.GetLength(1); j++)
                        {
                            if (j > tb.Rows.Cells.Count - 1) break;
                            HtmlTableCell td = tb.Rows.Cells;
                            if (td.Attributes["ByHTML"] == null)
                            {
                              td.InnerText = ReaderData.ToString();
                            }
                            else
                            {
                              td.InnerHtml = allowToHTML == true ? (ReaderData.ToString()) : ReaderData.ToString();;
                            }
                           

                            if (td.InnerText == "" && SpaceInEmptyCell == true) td.InnerHtml="&nbsp;";
                        }
                        if (i == ReaderData.GetLength(0)-1) break;
                        if (ft == FillType.Automatic || ft == FillType.DynamicRows)
                        {
                            HtmlTableRow tr = new HtmlTableRow();
                            tb.Rows.Add(tr);
                            for (int k = 0; k < tb.Rows.Cells.Count; k++)
                            {
                              HtmlTableCell prv_tc = tb.Rows.Cells;
                              HtmlTableCell tc = new HtmlTableCell();
                              tr.Cells.Add(tc);
                              CloneStyles(prv_tc, tc);
                            }
                        }
                        startRowID ++;
                  }
                }
}//fill table
void CloneStyles(HtmlControl obj, HtmlControl newobj)
{
                IEnumerator keys = obj.Style.Keys.GetEnumerator();
                while (keys.MoveNext())
                {
                  String key = (String)keys.Current; newobj.Style = obj.Style;
                }
                IEnumerator keys2 = obj.Attributes.Keys.GetEnumerator();
                while (keys2.MoveNext())
                {
                  String key = (String)keys2.Current; newobj.Attributes = obj.Attributes;
                }

} 模板样例输出

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

全自动填充,表现行、列均不固定,全由SQL查询效果动态输出,仅设置首行首列的样式即可,如下图:
https://img-blog.csdnimg.cn/direct/ccdd64e315ab4c62a6c0cc06cc891f3b.png
 前端代码示例 :
<table id="tjTable" runat="server" align="center" border="1" style="width: 700px; border:1px solid #000000;border-collapse:collapse">
      <tr><td>标题</td></tr>
      <tr>
            <td>
                &nbsp;</td>
         </tr>
</table> 调用示例如下代码:
string refSQL = "select value,text,sortid from pub_chinaPay order by sortid";
FillTable(tjTable, FillType.Automatic, true, 0, 1, 1); 输出效果如下图 
https://img-blog.csdnimg.cn/direct/2ec451bf905a43c785ffc4dce59cd29f.png
可以看到行列完全由SQL语句决定进行原始输出,行与列均为动态输出 。 


DynamicRows 模式填充

动态行填充,表现行输出不固定,已预知列的输出,仅需要设置首行标题列和数据行的样式即可,如下图:
https://img-blog.csdnimg.cn/direct/08df0d3cb31447c980da428a81ba4991.png
 前端代码示例 :
<table id="tjTable" runat="server" align="center" border="1" style="width: 700px; border:1px solid #000000;border-collapse:collapse">
      <tr>
            <td>
               状态代码</td>
            <td>
               状态名称</td>
            <td>
               排序号</td>
      </tr>
      <tr>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
      </tr>
    </table> 调用示例如下代码:
string refSQL = "select value,text,sortid from pub_chinaPay order by sortid";
FillTable(tjTable, FillType.DynamicRows, true, 0, 1, 1); 输出效果如下图 
https://img-blog.csdnimg.cn/direct/fc170851637f437293fd843f70aa1bf1.png
可以看到举动动态输出,标题列为预期的设置 。 
StaticRows 模式填充

静态填充,表现行、列均固定,由SQL查询效果根据预设输出,可设置每行每列的样式,如下图:
https://img-blog.csdnimg.cn/direct/47c8abc34a934feea5708937c598d061.png
 前端代码示例 :
<table id="tjTable" runat="server" align="center" border="1" style="width: 700px; border:1px solid #000000;border-collapse:collapse">
      <tr>
            <td>
               状态代码</td>
            <td>
               状态名称</td>
            <td>
               排序号</td>
      </tr>
      <tr>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
      </tr>
      <tr>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
      </tr>
      <tr>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
      </tr>
      <tr>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
      </tr>
      <tr>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
      </tr>
      <tr>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
      </tr>
      <tr>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
      </tr>
      <tr>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
      </tr>
    </table> 调用示例如下代码:
string refSQL = "select value,text,sortid from pub_chinaPay order by sortid";
FillTable(tjTable,FillType.StaticRows, true, 0, 1, 1);
输出效果如下图 
https://img-blog.csdnimg.cn/direct/7f27b68004964a718bb72d17c347cbcc.png
可以看到行有冗余,因此静态行模式仅输出列和行的可见区域,即溢出和不足均不显示 。 


小结

关于 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企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: C# Web控件与数据感应之 填充 HtmlTable