65.9K
CodeProject 正在变化。 阅读更多。
Home

完全定制的可重用 ASP+ 垂直/水平跑马灯,使用 XML/MS SQL

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.59/5 (16投票s)

2005 年 5 月 24 日

1分钟阅读

viewsIcon

92772

downloadIcon

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 数据库连接字符串...

© . All rights reserved.