C#版 Tag云图控件

今天看到TerryLee的一篇文章 http://www.cnblogs.com/Terrylee/archive/2008/02/20/1075764.html,其中有一条 ASP.NET Tag/Search Cloud Server Control(导读:在Web2.0时代,Tag成为了一个标志,通常一些网站都会采用Tag云图来显示。有“好事者”干脆开发了一个Tag云的ASP.NET服务器控件),里边的源文件是用vb写的,我就把代码改改,转换成C#的了,代码我直接贴出来吧,大家自己看吧!

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Data;
using System.Collections;
using System.Text.RegularExpressions;

namespace Conovosoft.Web.UI.WebControls
{
[ToolboxData(
"<{0}:SearchCloudrunat=server></{0}:SearchCloud>")]
publicclassSearchCloud:WebControl
{
"属性"#region"属性"

"Appearance"#region"Appearance"

[Bindable(
true),Category("Appearance"),Localizable(true)]
publicintMinFontSize
{
get
{
strings=(string)ViewState["MinFontSize"];
if(String.IsNullOrEmpty(s))
return10;
else
{
intresult=10;
int.TryParse(s,outresult);
returnresult;
}

}

set
{
ViewState[
"MinFontSize"]=value;
}

}


[Bindable(
true),Category("Appearance"),Localizable(true)]
publicintMaxFontSize
{
get
{
strings=(string)ViewState["MaxFontSize"];
if(String.IsNullOrEmpty(s))
return22;
else
{
intresult=22;
int.TryParse(s,outresult);
returnresult;
}

}

set
{
ViewState[
"MaxFontSize"]=value;
}

}


[Bindable(
true),Category("Appearance"),Localizable(true)]
publicstringFontUint
{
get
{
strings=(string)ViewState["FontUint"];
if(String.IsNullOrEmpty(s))
return"pt";
else
returns;
}

set
{
switch(value)
{
case"pt":
case"em":
case"%":
case"px":
ViewState[
"FontUnit"]=value;break;
default:
ViewState[
"FontUnit"]="px";break;
}

}

}


[Bindable(
true),Category("Appearance"),Localizable(true)]
publicstringMaxColor
{
get
{
strings=(string)ViewState["MaxColor"];

if(String.IsNullOrEmpty(s))
return"#00f";
else
returns;
}

set
{
ViewState[
"MaxColor"]=value;
}

}


[Bindable(
true),Category("Appearance"),Localizable(true)]
publicstringMinColor
{
get
{
strings=(string)ViewState["MinColor"];

if(String.IsNullOrEmpty(s))
return"#000";
else
returns;
}

set
{
ViewState[
"MinColor"]=value;
}

}


#endregion


"Data"#region"Data"

[Bindable(
true),Category("Data"),DefaultValue("")]
publicDataSetDataSource
{
get
{
return(DataSet)ViewState["DataSource"];
}

set
{
ViewState[
"DataSource"]=value;
}

}


[Bindable(
true),Category("Data"),DefaultValue(""),Localizable(true)]
publicstringDataIDField
{
get
{
return(string)ViewState["DataIDField"];
}

set
{
ViewState[
"DataIDField"]=value;
}

}


[Bindable(
true),Category("Data"),DefaultValue(""),Localizable(true)]
publicstringDataKeywordField
{
get
{
return(string)ViewState["DataKeywordField"];
}

set
{
ViewState[
"DataKeywordField"]=value;
}

}


[Bindable(
true),Category("Data"),DefaultValue(""),Localizable(true)]
publicstringDataURLField
{
get
{
return(string)ViewState["DataURLField"];
}

set
{
ViewState[
"DataURLField"]=value;
}

}


[Bindable(
true),Category("Data"),DefaultValue(""),Localizable(true)]
publicstringDataCountField
{
get
{
return(string)ViewState["DataCountField"];
}

set
{
ViewState[
"DataCountField"]=value;
}

}


[Bindable(
true),Category("Data"),Localizable(true)]
publicstringKeywordTitleFormat
{
get
{
strings=(string)ViewState["KeywordTitleFormat"];
if(String.IsNullOrEmpty(s))
{
return"%koccured%ctimes";
}

else
{
return(string)ViewState["KeywordTitleFormat"];
}

}

set
{
ViewState[
"KeywordTitleFormat"]=value;
}

}


[Bindable(
true),Category("Data"),Localizable(true)]
publicstringKeywordURLFormat
{
get
{
return(string)ViewState["KeywordURLFormat"];
}

set
{
ViewState[
"KeywordURLFormat"]=value;
}

}


[Bindable(
true),Category("Data"),DefaultValue(""),Localizable(true)]
publicstringSortBy
{
get
{
return(string)ViewState["SortBy"];
}

set
{
ViewState[
"SortBy"]=value;
}

}


#endregion


[Bindable(
false),Category("Debug"),DefaultValue(false),Localizable(true)]
publicBooleanDebug
{
get
{
if(ViewState["Debug"]!=null)
{
return(Boolean)ViewState["Debug"];
}

else
{
returnfalse;
}


}

set
{
ViewState[
"Debug"]=value;
}

}


PrivateProperties#regionPrivateProperties

privateHashtablearrAttributes;

privatestringCloudHTML
{
get
{
strings=(string)ViewState["CloudHTML"];
if(String.IsNullOrEmpty(s))
{
returnstring.Empty;
}

returns;
}

set
{
ViewState[
"CloudHTML"]=value;
}

}


privateHashtableKeyAttributes
{
get
{
returnarrAttributes;
}

set
{
arrAttributes
=value;
}

}


#endregion


#endregion


protectedoverridevoidRender(HtmlTextWriterwriter)
{
if(!String.IsNullOrEmpty(CloudHTML))
{
writer.WriteBeginTag(
"div");

if(!String.IsNullOrEmpty(CssClass))
{
writer.WriteAttribute(
"class",CssClass);
}

writer.Write(HtmlTextWriter.TagRightChar);
writer.Write(CloudHTML);
writer.WriteEndTag(
"div");
}

else
{
writer.Write(
"这儿没有产生HTML,一个未操作错误发生.");
}

}


protectedoverridevoidOnLoad(EventArgse)
{
if(DataSource==null)
{
CloudHTML
="请指定DataSet";
return;
}

if(DataIDField==string.Empty)
{
CloudHTML
="请指定一个ID数据段";
return;
}

if(DataKeywordField==string.Empty)
{
CloudHTML
="请指定一个关键词数据段";
return;
}

if(DataCountField==string.Empty)
{
CloudHTML
="请指定一个关键词数量数据段";
return;
}

if(!Regex.IsMatch(MinColor,"^#([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?$"))
{
CloudHTML
="最小颜色必须为十六进制编码并且必须为如:#000or#ff99cc";
return;
}

if(!Regex.IsMatch(MaxColor,"^#([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?$"))
{
CloudHTML
="最小颜色必须为十六进制编码并且必须为如:#000or#ff99cc";
return;
}


try
{
StringBuildersb
=newStringBuilder();
DataViewdv
=newDataView(DataSource.Tables[0]);
//DataRowViewrow;

dv.Sort
=string.Format("{0}DESC",DataCountField);

intcount=dv.Count;

if(count==0)
{
CloudHTML
="没有任何值产生云";
return;
}


intMaxQty=int.Parse(dv[0].Row[DataCountField].ToString());
intMinQty=int.Parse(dv[dv.Count-1].Row[DataCountField].ToString());

intSpread=MaxQty-MinQty;

if(Spread==0)
Spread
=1;

intFontSpread=MaxFontSize-MinFontSize;
if(FontSpread==0)
FontSpread
=1;

doubleFontStep=(double)(FontSpread)/Spread;

if(!string.IsNullOrEmpty(SortBy))
{
dv.Sort
=SortBy;
}

else
{
dv.Sort
=string.Format("{0}ASC",DataKeywordField);
}


foreach(DataRowViewrowindv)
{
intsKeyID=int.Parse(row.Row[DataIDField].ToString());
stringsKeyWord=row.Row[DataKeywordField].ToString();
intsKeyCount=int.Parse(row.Row[DataCountField].ToString());
stringsKeyURL;
stringColorRGB;
doubleWeight=MinFontSize+((sKeyCount-MinQty)*FontStep);
intFontDiff=MaxFontSize-MinFontSize;
doubleColorWeight=Math.Round(99*(Weight-MinFontSize)/(FontDiff)+1);

if(MinColor==MaxColor)
{
ColorRGB
=MinColor;
}

else
{
ColorRGB
=Colorize(MinColor,MaxColor,ColorWeight);
}


if(String.IsNullOrEmpty(DataURLField))
{
if(!String.IsNullOrEmpty(KeywordURLFormat))
{
sKeyURL
=ReplaceKeyValues(KeywordURLFormat,sKeyID,sKeyWord,"",sKeyCount);
}

else
{
sKeyURL
="#";
}

}

else
{
sKeyURL
=row[DataURLField].ToString();
}

sb.Append(
string.Format("<ahref=/"{0}/"style=/"font-size:{1}{5};color:{4};/"title=/"{2}/"{6}>{3}</a>",
sKeyURL,
Math.Round(Weight),
ReplaceKeyValues(KeywordTitleFormat,sKeyID,sKeyWord,sKeyURL,sKeyCount),
HttpContext.Current.Server.HtmlEncode(sKeyWord),
ColorRGB,
FontUint,
GenerateAttributes(sKeyWord,sKeyID,sKeyURL,sKeyCount)));
}

CloudHTML
=sb.ToString();
}

catch(Exceptionex)
{
if(!Debug)
{
CloudHTML
="错误产生";
}

else
{
throwex;
}

}

finally
{
base.OnLoad(e);
}

}


publicvoidAddAttribute(stringvalue,stringtext)
{
if(KeyAttributes==null)
{
KeyAttributes
=newHashtable();
}

KeyAttributes.Add(value,text);
}


privatestringGenerateAttributes(stringk,intid,stringu,intc)
{
if(KeyAttributes==null)
{
returnstring.Empty;
}


StringBuilders
=newStringBuilder();
ICollectionkeys
=KeyAttributes.Keys;

foreach(objectkeyinkeys)
{
s.Append(
string.Format("{0}=/"{1}/"",key,ReplaceKeyValues(KeyAttributes[key].ToString(),id,k,u,c)));
}


returns.ToString();
}


privatestringReplaceKeyValues(stringtxt,intid,stringk,stringu,intc)
{
k
=k.Replace("'","&apos;");

txt
=txt.Replace("%i",id.ToString());
txt
=txt.Replace("%k",HttpContext.Current.Server.HtmlEncode(k));
txt
=txt.Replace("%u",u);
txt
=txt.Replace("%c",c.ToString());

returntxt;
}


privatestringColorize(stringminc,stringmaxc,doublew)
{
w
=w/100;
stringrs,gs,bs;
stringr,g,b;
intminr,ming,minb,maxr,maxg,maxb;

if(minc.Length==4)
{
rs
=minc.Substring(1,1);
gs
=minc.Substring(2,1);
bs
=minc.Substring(3,1);

minc
="#"+rs+rs+gs+gs+bs+bs;
}


if(maxc.Length==4)
{
rs
=maxc.Substring(1,1);
gs
=maxc.Substring(2,1);
bs
=maxc.Substring(3,1);

maxc
="#"+rs+rs+gs+gs+bs+bs;
}


minr
=Convert.ToInt32(minc.Substring(1,2),16);
ming
=Convert.ToInt32(minc.Substring(3,2),16);
minb
=Convert.ToInt32(minc.Substring(5,2),16);

maxr
=Convert.ToInt32(maxc.Substring(1,2),16);
maxg
=Convert.ToInt32(maxc.Substring(3,2),16);
maxb
=Convert.ToInt32(maxc.Substring(5,2),16);

r
=Convert.ToString(int.Parse(Math.Round(((maxr-minr)*w)+minr).ToString()),16);
g
=Convert.ToString(int.Parse(Math.Round(((maxg-ming)*w)+ming).ToString()),16);
b
=Convert.ToString(int.Parse(Math.Round(((maxb-minb)*w)+minb).ToString()),16);

if(r.Length==1)
r
="0"+r;
if(g.Length==1)
g
="0"+g;
if(b.Length==1)
b
="0"+b;

stringcolor;
color
="#"+r+g+b;

returncolor;
}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值