花了一个下午,编了一个动态显示一行多标题的自定义控件。该控件实现的功能是:
1、控件的参数配置储存在数据库;
2、自定义实现控件的宽度和长度;
3、自定义的字体的大小、是否粗体(其他样式可以自行扩展);
4、根据字体的个数,大小和控件的宽度,自动的调整一行显示标题的个数;
5、实现的功能主要是方便编辑进行编辑。
数据库
USE
[
CYZone2
]
GO

/**/
/****** 对象: Table [dbo].[CommendParam] 脚本日期: 08/07/2007 17:24:27 ******/
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
CREATE
TABLE
[
dbo
]
.
[
CommendParam
]
(
[
PlateID
]
[
int
]
IDENTITY
(
1
,
1
)
NOT
NULL
,
[
PlateName
]
[
nvarchar
]
(
50
) COLLATE Chinese_PRC_CI_AS
NULL
CONSTRAINT
[
DF_CommendParam_PlateName
]
DEFAULT
(
''
),
[
IsBold
]
[
bit
]
NULL
CONSTRAINT
[
DF_CommendParam_IsBold
]
DEFAULT
((
0
)),
[
IsItalics
]
[
bit
]
NULL
CONSTRAINT
[
DF_CommendParam_IsItalics
]
DEFAULT
((
0
)),
[
Width
]
[
nvarchar
]
(
50
) COLLATE Chinese_PRC_CI_AS
NULL
CONSTRAINT
[
DF_CommendParam_Width
]
DEFAULT
(
''
),
[
Heiht
]
[
nvarchar
]
(
50
) COLLATE Chinese_PRC_CI_AS
NULL
CONSTRAINT
[
DF_CommendParam_Heiht
]
DEFAULT
(
''
),
[
RowNum
]
[
int
]
NULL
CONSTRAINT
[
DF_CommendParam_RowNum
]
DEFAULT
((
0
)),
[
WordNum
]
[
int
]
NULL
CONSTRAINT
[
DF_CommendParam_WordNum
]
DEFAULT
((
0
)),
[
FontSize
]
[
nvarchar
]
(
50
) COLLATE Chinese_PRC_CI_AS
NULL
CONSTRAINT
[
DF_CommendParam_FontSize
]
DEFAULT
(
''
),
[
TitleNum
]
[
int
]
NULL
CONSTRAINT
[
DF_CommendParam_TitleNum
]
DEFAULT
((
0
)),
[
ClassID
]
[
int
]
NULL
CONSTRAINT
[
DF_CommendParam_ClassID
]
DEFAULT
((
0
)),
CONSTRAINT
[
PK_CommendParam
]
PRIMARY
KEY
CLUSTERED
(
[
PlateID
]
ASC
)
WITH
(PAD_INDEX
=
OFF
, IGNORE_DUP_KEY
=
OFF
)
ON
[
PRIMARY
]
)
ON
[
PRIMARY
]
因为该控件不涉及前台设计,下面只提供该控件的后台
public
partial
class
Controls_Home_AticleView : System.Web.UI.UserControl

...
{
private int pid;

/**//// <summary>
/// 推荐文章的分类ID
/// </summary>
public int PID

...{

set ...{ pid = value; }
}

//private string _FontSize;


/**////// <summary>
///// 字体大小
///// </summary>
//public string FontSize
//{
// set { _FontSize = value; }
//}
private string _CssClass;

/**//// <summary>
/// CSS样式
/// </summary>
public string CssClass

...{

set ...{ _CssClass = value; }
}

private string _StartRow = "1";

/**//// <summary>
/// 开始行,默认1
/// </summary>
public string StartRow

...{

set ...{ _StartRow = value; }
}
CommendParam bll = new CommendParam();
protected void Page_Load(object sender, EventArgs e)

...{
CommendParamInfo param = new CommendParamInfo();
//该函数主要实现获取数据表中的参数信息
param = bll.GetPlateParam(pid);

//该函数主要实现获取相关的文章
DataSet ds = bll.GetCOmmendArticle(param.ClassID, pid, int.Parse(_StartRow));

int len = ds.Tables[0].Rows.Count;

int[] arr = new int[len];

for (int i = 0; i < len; i++)

...{
DataRow dr = ds.Tables[0].NewRow();
dr = ds.Tables[0].Rows[i];
string title = dr["title"].ToString();
int num = title.Length;
int titlewidth = num * int.Parse(param.FontSize);

if (titlewidth > int.Parse(param.Width))

...{
dr["title"] = StringUtil.GetSubString(title, param.WordNum);
string t = dr["title"].ToString();
arr[i] = t.Length * int.Parse(param.FontSize);
}
else

...{
arr[i] = titlewidth + 1;
}
}
int ii = 0;
int rowNum = 1;
int rowlen = 0;
string html = "<table><tr><td class='" + _CssClass + "'>";
for (int i = 0; i < len; i++)

...{
rowlen += arr[ii];
if (rowlen > int.Parse(param.Width))

...{
html += "</td></tr><tr><td class='" + _CssClass + "'>";
rowlen = 0;
rowNum += 1;
i = i - 1;
}
else

...{
DataRow dr = ds.Tables[0].NewRow();
dr = ds.Tables[0].Rows[i];
//html += "<span style='font-size:" + param.FontSize + "px;'><a href=" + dr["linkurl"] + ">" + dr["title"].ToString() + "</a> </span>";
html += "<span class=" + _CssClass + "'><a href=" + dr["linkurl"] + ">" + dr["title"].ToString() + "</a> </span>";
ii = ii + 1;
}
if (rowNum == param.RowNum)

...{
break;
}
}
if (rowNum< param.RowNum)

...{
rowNum += 3;
while (rowNum < param.RowNum)

...{
html += "</td></tr><tr><td> ";
rowNum += 1;
}
}
html += "</td></tr></table>";
this.divshow.InnerHtml = html;
//Response.Write(html);
}
}
其中涉及到的模型和函数
public
class
CommendParam : GetCN

...
{
private SqlDataReader rdr = null;
private DataSet ds = null;
public CommendParam()

...{ }

public CommendParamInfo GetPlateParam(int plateID)

...{
CommendParamInfo param = null;
string sql = "select * from CommendParam where PlateID=" + plateID;
try

...{
rdr = RunReaderSql(sql);
while (rdr.Read())

...{
param = new CommendParamInfo(rdr.GetInt32(0), rdr.GetString(1), rdr.GetBoolean(2), rdr.GetBoolean(3),
rdr.GetString(4), rdr.GetString(5), rdr.GetInt32(6), rdr.GetInt32(7), rdr.GetString(8),
rdr.GetInt32(9), rdr.GetInt32(10));
}
rdr.Close();
rdr.Dispose();
if (param != null)

...{
return param;
}
else

...{
return null;
}
}

catch ...{ return null; }
}

public DataSet GetCOmmendArticle(int classID,int pid,int num,int startrow)

...{
string sql = "";
if (num > 0)

...{
sql = "select top " + num + " id,title,linkurl,ImgUrl from Commend_Article where is_del=0 and ClassSmallId=" + classID;
}
else

...{
sql = "select id,title,linkurl,ImgUrl from Commend_Article where is_del=0 and ClassSmallId=" + classID;
}
if (startrow > 1)

...{
sql = sql + " and id not in (select top " + startrow + " id from Commend_Article where is_del=0 and ClassSmallId=" + classID + ")";
}
sql = sql + " order by gradation desc,createtime desc";

DataSet ds = new DataSet();
try

...{
ds = RunSql(sql);
return ds;
}

catch ...{ return null; }
}

public DataSet GetCOmmendArticle(int classID,int pid)

...{
return GetCOmmendArticle(classID, pid, 0, 1);
}

public DataSet GetCOmmendArticle(int classID, int pid, int startRow)

...{
return GetCOmmendArticle(classID, pid, 0, startRow);
}
}
public
class
CommendParamInfo

...
{
private int _PlateID;
private string _PlateName;
private bool _IsBold;
private bool _IsItalics;
private string _Width;
private string _Height;
private int _RowNum;
private int _WordNum;
private string _FontSize;
private int _TitleNum;
private int _ClassID;

public CommendParamInfo()

...{
}

/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="plateid">版块ID</param>
/// <param name="platename">版块名称</param>
/// <param name="isbold">是否粗体</param>
/// <param name="isitalics">是否斜体</param>
/// <param name="width">版块宽度</param>
/// <param name="height">版块高度</param>
/// <param name="rownum">版块行数</param>
/// <param name="wordnum">标题最长字数</param>
/// <param name="fontsize"> 字体大小</param>
/// <param name="titlenum">标题个数</param>
/// <param name="classid">标题分类ID</param>
public CommendParamInfo(int plateid, string platename, bool isbold, bool isitalics, string width, string height, int rownum, int wordnum, string fontsize, int titlenum,int classid)

...{
this._PlateID = plateid;
this._PlateName = platename;
this._IsBold = isbold;
this._IsItalics = isitalics;
this._Width = width;
this._Height = height;
this._RowNum = rownum;
this._WordNum = wordnum;
this._FontSize = fontsize;
this._TitleNum = titlenum;
this._ClassID = classid;
}

/**//// <summary>
/// 版块ID
/// </summary>
public int PlateID

...{

get ...{ return _PlateID; }

set ...{ _PlateID = value; }
}

/**//// <summary>
/// 版块名称
/// </summary>
public string PlateName

...{

get ...{ return _PlateName; }

set ...{ _PlateName = value; }
}

/**//// <summary>
/// 是否粗体
/// </summary>
public bool IsBold

...{

get ...{ return _IsBold; }

set ...{ _IsBold = value; }
}

/**//// <summary>
/// 是否斜体
/// </summary>
public bool IsItalic

...{

get ...{ return _IsItalics; }

set ...{ _IsItalics = value; }
}

/**//// <summary>
/// 版块宽度
/// </summary>
public string Width

...{

get ...{ return _Width; }

set ...{ _Width = value; }
}

/**//// <summary>
/// 版块高度
/// </summary>
public string Heiht

...{

get ...{ return _Height; }

set ...{ _Height = value; }
}

/**//// <summary>
/// 版块行数
/// </summary>
public int RowNum

...{

get ...{ return _RowNum; }

set ...{ _RowNum = value; }
}

/**//// <summary>
/// 标题最长字数
/// </summary>
public int WordNum

...{

get ...{ return _WordNum; }

set ...{ _WordNum = value; }
}

/**//// <summary>
/// 字体大小
/// </summary>
public string FontSize

...{

get ...{ return _FontSize; }

set ...{ _FontSize = value; }
}

/**//// <summary>
/// 标题个数
/// </summary>
public int TitleNum

...{

get ...{ return _TitleNum; }

set ...{ _TitleNum = value; }
}

/**//// <summary>
/// 标题分类ID
/// </summary>
public int ClassID

...{

get ...{ return _ClassID; }

set ...{ _ClassID = value; }
}
}