今天看到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>
"
)]
public
class
SearchCloud:WebControl
{
#region
"属性"
#region
"Appearance"
[Bindable(
true
),Category(
"
Appearance
"
),Localizable(
true
)]
public
int
MinFontSize
{
get
{
string
s
=
(
string
)ViewState[
"
MinFontSize
"
];
if
(String.IsNullOrEmpty(s))
return
10
;
else
{
int
result
=
10
;
int
.TryParse(s,
out
result);
return
result;
}
}
set
{
ViewState[
"
MinFontSize
"
]
=
value;
}
}
[Bindable(
true
),Category(
"
Appearance
"
),Localizable(
true
)]
public
int
MaxFontSize
{
get
{
string
s
=
(
string
)ViewState[
"
MaxFontSize
"
];
if
(String.IsNullOrEmpty(s))
return
22
;
else
{
int
result
=
22
;
int
.TryParse(s,
out
result);
return
result;
}
}
set
{
ViewState[
"
MaxFontSize
"
]
=
value;
}
}
[Bindable(
true
),Category(
"
Appearance
"
),Localizable(
true
)]
public
string
FontUint
{
get
{
string
s
=
(
string
)ViewState[
"
FontUint
"
];
if
(String.IsNullOrEmpty(s))
return
"
pt
"
;
else
return
s;
}
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
)]
public
string
MaxColor
{
get
{
string
s
=
(
string
)ViewState[
"
MaxColor
"
];
if
(String.IsNullOrEmpty(s))
return
"
#00f
"
;
else
return
s;
}
set
{
ViewState[
"
MaxColor
"
]
=
value;
}
}
[Bindable(
true
),Category(
"
Appearance
"
),Localizable(
true
)]
public
string
MinColor
{
get
{
string
s
=
(
string
)ViewState[
"
MinColor
"
];
if
(String.IsNullOrEmpty(s))
return
"
#000
"
;
else
return
s;
}
set
{
ViewState[
"
MinColor
"
]
=
value;
}
}
#endregion
#region
"Data"
[Bindable(
true
),Category(
"
Data
"
),DefaultValue(
""
)]
public
DataSetDataSource
{
get
{
return
(DataSet)ViewState[
"
DataSource
"
];
}
set
{
ViewState[
"
DataSource
"
]
=
value;
}
}
[Bindable(
true
),Category(
"
Data
"
),DefaultValue(
""
),Localizable(
true
)]
public
string
DataIDField
{
get
{
return
(
string
)ViewState[
"
DataIDField
"
];
}
set
{
ViewState[
"
DataIDField
"
]
=
value;
}
}
[Bindable(
true
),Category(
"
Data
"
),DefaultValue(
""
),Localizable(
true
)]
public
string
DataKeywordField
{
get
{
return
(
string
)ViewState[
"
DataKeywordField
"
];
}
set
{
ViewState[
"
DataKeywordField
"
]
=
value;
}
}
[Bindable(
true
),Category(
"
Data
"
),DefaultValue(
""
),Localizable(
true
)]
public
string
DataURLField
{
get
{
return
(
string
)ViewState[
"
DataURLField
"
];
}
set
{
ViewState[
"
DataURLField
"
]
=
value;
}
}
[Bindable(
true
),Category(
"
Data
"
),DefaultValue(
""
),Localizable(
true
)]
public
string
DataCountField
{
get
{
return
(
string
)ViewState[
"
DataCountField
"
];
}
set
{
ViewState[
"
DataCountField
"
]
=
value;
}
}
[Bindable(
true
),Category(
"
Data
"
),Localizable(
true
)]
public
string
KeywordTitleFormat
{
get
{
string
s
=
(
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
)]
public
string
KeywordURLFormat
{
get
{
return
(
string
)ViewState[
"
KeywordURLFormat
"
];
}
set
{
ViewState[
"
KeywordURLFormat
"
]
=
value;
}
}
[Bindable(
true
),Category(
"
Data
"
),DefaultValue(
""
),Localizable(
true
)]
public
string
SortBy
{
get
{
return
(
string
)ViewState[
"
SortBy
"
];
}
set
{
ViewState[
"
SortBy
"
]
=
value;
}
}
#endregion
[Bindable(
false
),Category(
"
Debug
"
),DefaultValue(
false
),Localizable(
true
)]
public
BooleanDebug
{
get
{
if
(ViewState[
"
Debug
"
]
!=
null
)
{
return
(Boolean)ViewState[
"
Debug
"
];
}
else
{
return
false
;
}
}
set
{
ViewState[
"
Debug
"
]
=
value;
}
}
PrivateProperties
#endregion
protected
override
void
Render(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,一个未操作错误发生.
"
);
}
}
protected
override
void
OnLoad(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
=
new
StringBuilder();
DataViewdv
=
new
DataView(DataSource.Tables[
0
]);
//
DataRowViewrow;
dv.Sort
=
string
.Format(
"
{0}DESC
"
,DataCountField);
int
count
=
dv.Count;
if
(count
==
0
)
{
CloudHTML
=
"
没有任何值产生云
"
;
return
;
}
int
MaxQty
=
int
.Parse(dv[
0
].Row[DataCountField].ToString());
int
MinQty
=
int
.Parse(dv[dv.Count
-
1
].Row[DataCountField].ToString());
int
Spread
=
MaxQty
-
MinQty;
if
(Spread
==
0
)
Spread
=
1
;
int
FontSpread
=
MaxFontSize
-
MinFontSize;
if
(FontSpread
==
0
)
FontSpread
=
1
;
double
FontStep
=
(
double
)(FontSpread)
/
Spread;
if
(
!
string
.IsNullOrEmpty(SortBy))
{
dv.Sort
=
SortBy;
}
else
{
dv.Sort
=
string
.Format(
"
{0}ASC
"
,DataKeywordField);
}
foreach
(DataRowViewrow
in
dv)
{
int
sKeyID
=
int
.Parse(row.Row[DataIDField].ToString());
string
sKeyWord
=
row.Row[DataKeywordField].ToString();
int
sKeyCount
=
int
.Parse(row.Row[DataCountField].ToString());
string
sKeyURL;
string
ColorRGB;
double
Weight
=
MinFontSize
+
((sKeyCount
-
MinQty)
*
FontStep);
int
FontDiff
=
MaxFontSize
-
MinFontSize;
double
ColorWeight
=
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
{
throw
ex;
}
}
finally
{
base
.OnLoad(e);
}
}
public
void
AddAttribute(
string
value,
string
text)
{
if
(KeyAttributes
==
null
)
{
KeyAttributes
=
new
Hashtable();
}
KeyAttributes.Add(value,text);
}
private
string
GenerateAttributes(
string
k,
int
id,
string
u,
int
c)
{
if
(KeyAttributes
==
null
)
{
return
string
.Empty;
}
StringBuilders
=
new
StringBuilder();
ICollectionkeys
=
KeyAttributes.Keys;
foreach
(
object
key
in
keys)
{
s.Append(
string
.Format(
"
{0}=/
"
{
1
}
/
""
,key,ReplaceKeyValues(KeyAttributes[key].ToString(),id,k,u,c)));
}
return
s.ToString();
}
private
string
ReplaceKeyValues(
string
txt,
int
id,
string
k,
string
u,
int
c)
{
k
=
k.Replace(
"
'
"
,
"
'
"
);
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());
return
txt;
}
private
string
Colorize(
string
minc,
string
maxc,
double
w)
{
w
=
w
/
100
;
string
rs,gs,bs;
string
r,g,b;
int
minr,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;
string
color;
color
=
"
#
"
+
r
+
g
+
b;
return
color;
}
}
}
































































































































































































































































































































































































































































































































