Visual Studio .NET 2002SQL Server 2000.NET 1.0DBAWebFormsXMLHTMLIntermediateDevVisual StudioSQL ServerSQLWindows.NETASP.NETC#
完全定制的可重用 ASP+ 垂直/水平跑马灯,使用 XML/MS SQL






4.59/5 (16投票s)
2005 年 5 月 24 日
1分钟阅读

92772

1241
垂直/水平跑马灯 Web 自定义控件,使用 SQL Server 数据库/XML,具有出色的设计时属性。
引言
在每个项目中,我都需要一种显示最新文章、新闻、天气预报等的方式。 一些项目处理带有查询字符串的链接,而另一些则不处理.. 我的理想解决方案是一个快速、简单、轻量级的跑马灯 Web 自定义控件...
如果您不熟悉自定义 Web 控件,以下是来自 Microsoft 文档的部分定义
Web 控件在服务器上运行,包括表单控件,例如按钮和文本框,以及特殊用途控件,例如日历。 这允许您以编程方式控制网页上的这些元素。 Web 控件比 HTML 控件更抽象。 它们的 object 模型不一定反映 HTML 语法。 (参见 MSDN。)
特点
- 出色的设计时属性。
- 允许您选择数据库:XML 或 SQL Server。
- 您可以应用您的 Web 模板。
- 每个主题都有 ID、描述、日期、锚点 URL、锚点文本。
数据库
在 XML 作为数据库的情况下
<?xml version="1.0" encoding="utf-8" ?>
<marquee>
<topic tpID='1' postDate='1/1/2002'>
<url value='http://www.....com'> Link... </url>
<hint><![CDATA[ Link Description goes here ]]></hint>
</topic>
</marquee>
使用代码
我们的控件有三个类
Marquee: WebControl
(渲染控件)。Data
(从数据库(XML 或 SQL Server)读取数据并生成主题集合)。Anchor
(数据持有者)。
首先,我们将预览 Data
类代码
public class Data
{
public ArrayList GetNews(string str,bool _isXML)
{
//setup Array List
ArrayList AnchorsArrayList=new ArrayList();
if(!_isXML)// Read From MSSQL DB :::::::::::::
{
try
{
//Select SQl Query : text,url,id,date,title , Table Name links
string sqlSelectStr="SELECT text, url, id, date, title FROM links";
SqlConnection myConnection;
//connect DB And check without overload on the DB Server.
myConnection=new SqlConnection(str);
if(myConnection.State==ConnectionState.Closed){myConnection.Open();}
//pass our SQL Str within new Command
SqlCommand myCommand=new SqlCommand(sqlSelectStr,myConnection);
//Creating A Reader to store Returned Database Data
SqlDataReader myReader=myCommand.ExecuteReader();
//looping thrugh Reader.
while(myReader.Read())
{
//intialize Anchor Object
Anchor anc=new Anchor();
//set Object id
anc.Id=Convert.ToInt32(myReader["id"]);
//set Object url
anc.Url=myReader["url"].ToString();
//set Object text
anc.Text=myReader["text"].ToString();
//set Object date
anc.Date=(DateTime)myReader["date"];
//set Object Hints
anc.Title=myReader["title"].ToString();
//add it to our Collection
AnchorsArrayList.Add(anc);
}
//Dispose any relation with DB
myReader.Close();
myConnection.Close();
}
catch(Exception ex)
{
throw ex;
}
}
else // Read From XML DB ::::::::::::::::::::::::::::::::::
{
try
{
// create XMLDocument and Load Xml File
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load(str);
//create XPath Navigator in order to navigate XML Nodes...
XPathNavigator nav=xmlDoc.CreateNavigator();
// create Two NodeItrators in order to loop throw Topics
XPathNodeIterator navIterator;//topic
XPathNodeIterator navIterator2;//details
//Set XPath to Topic Node...
navIterator=nav.Select("marquee/topic");
//topic number
int topicNo=1;
while(navIterator.MoveNext())
{
//intialize Anchor Object
Anchor anc=new Anchor();
//read current topic ID and Date...I didnt
//use id or Date in this article
//but you can use it in sorting
//search or Quary Strings between pages
anc.Id=
Convert.ToInt32(navIterator.Current.GetAttribute("tpID",
"").ToString());
anc.Date=
Convert.ToDateTime(navIterator.Current.GetAttribute("postDate",
"").ToString());
//set Anchor/Link details XPath
navIterator2=nav.Select("marquee/topic["+topicNo+"]/url");
navIterator2.MoveNext();
//read URL and Text o the current topic
anc.Url=
navIterator2.Current.GetAttribute("value",
"").ToString();
anc.Text=navIterator2.Current.Value.ToString();
//set description XPath
navIterator2=nav.Select("marquee/topic["+topicNo+"]/hint");
navIterator2.MoveNext();
//read
anc.Title=navIterator2.Current.Value.ToString();
//finally... Save Our Link
AnchorsArrayList.Add(anc);
//moveNext
topicNo++;
}
}
catch(Exception ex)
{
throw ex;
}
}
//you are welcome......
return AnchorsArrayList;
}
}
现在我们来看看 Marquee
类。 有两种方法
Render(...)
AnchorsListHtmlGenerator(.....)
/// <summary>
/// Generate Links Html Tags according to user setting.
/// </summary>
/// <param name="aList">Type:ArrayList :collection
/// of Anchor Objects</param>
/// <returns>HTML as string</returns>
protected string AnchorsListHtmlGenerator(ArrayList aList)
{
StringBuilder s = new StringBuilder();
string dir;
bool pFlag;
//Set Langauge Direction Left-Right or Right-Left
if (arabicSupport){dir = "rtl";}else{dir = "ltr";}
//Set Marquee direction up-Down-Let-Right using enum
switch (marqueeDirection)
{
case Direction.up:
case Direction.down:
{
pFlag = true;
break;
}
default:
{
pFlag = false;
break;
}
}
//looping through Arraylist collection of Links.
for (int i = 0; i < aList.Count; i++)
{
//Check If User need to Show Hints Or not.
if (showTitle)
{
//Is Bold
if (TitleFontBold) { s.Append("<b>"); }
// <p> tag
if (pFlag) { s.Append("<p dir=\"" + dir + "\">"); }
//Font and Size
s.Append("<font size=\"" + titleFontSize +
"\" color=\"" +
urlTitleForeColor.Name.ToString() +
"\"" + ">");
//retrive Titles by looping through Passed ArrayList
s.Append((((Anchor)aList[i]).Title).ToString());
//</font>
s.Append("</font>");
//</p>
if (pFlag) { s.Append("</p>"); }
//</b>
if (TitleFontBold) { s.Append("</b>"); }
}
//<p> tag and set Direction
if (pFlag) { s.Append("<p dir=\"" + dir + "\">"); }
//set Image Source
if (showImage)
{
s.Append("<img src=" + listItemImageSrc + ">");
}
//
//<a> Tag
s.Append("<A href=\"");
//retrive and set Url from Passed ArrayList
s.Append((((Anchor)aList[i]).Url).ToString());
s.Append("\"");
//URL UnderLine Check and close </a>
if (urlUnderLine)
{
s.Append(" style=\"text-decoration: none\" ");
}
s.Append(">");
//Set text Font&Color
s.Append("<font size=\"");
s.Append(linkFontSize + "\" color=\"" +
urlForeColor.Name.ToString() + "\"" + ">");
s.Append((((Anchor)aList[i]).Text).ToString());
s.Append("</font></A>");
//
//
//</p>
if (pFlag) { s.Append("</p><p> </p>"); }
}
//Return Full HTML Code As String
return s.ToString();
}
Render
方法
/// <summary>
/// Render this control to web solution
/// </summary>
/// <param name="output"> The HTML writer to write out to </param>
protected override void Render(HtmlTextWriter output)
{
try
{
// make instance from Data Class
Data myData = new Data();
//Write Marquee Tag with Custome Attributes
output.Write("<marquee onmouseover=this.stop() " +
"onmouseout=this.start() scrollamount=1 " +
"scrolldelay=10 direction=" +
marqueeDirection.ToString() + " width=" +
width + " height=" + height + ">");
//check Bold Option
if (FontBold) { output.Write("<b>"); }
//write the Links Tag which returned
//by GetNew(connectionStr) Method
output.Write(AnchorsListHtmlGenerator(myData.GetNews(connectionStr,
isXML)));
//Bold Close Tag
if (FontBold) { output.Write("</b>"); }
//Marquee Close Tage
output.Write("</marquee>");
}
catch (Exception ex)
{
output.Write(ex.Message);
}
}
如何?..
在您的 Web 解决方案中注册 DLL 文件后,您必须:
- 决定数据库类型:XML 或 MS SQL Server。 如果您选择 XML,则设置属性
IsXML=true
. - 然后指定您的 XML 文件完整路径
ConnectionString="C:\resources\xml\XMLFile1.xml"
或者 在IsXml=false
的情况下,指定您的 MS SQL 数据库连接字符串...