using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Collections.ObjectModel;
using
System.Globalization;
using
System.ComponentModel;
using
System.Collections;
namespace
MyTestProj
{
[ParseChildren(
true
,
"
Items
"
)]
public
class
HyperListControls : DataBoundControl, INamingContainer, IRepeatInfoUser
{
public
string
DataUrlField
{
get
{
return
ViewState[
"
DataUrlField
"
]
==
null
?
""
: Convert.ToString(ViewState[
"
DataUrlField
"
], CultureInfo.CurrentCulture);
}
set
{ ViewState[
"
DataUrlField
"
]
=
value; }
}
public
string
DataTextField
{
get
{
return
ViewState[
"
DataTextField
"
]
==
null
?
""
: Convert.ToString(ViewState[
"
DataTextField
"
], CultureInfo.CurrentCulture);
}
set
{ ViewState[
"
DataTextField
"
]
=
value; }
}
public
string
DataTipField
{
get
{
return
ViewState[
"
DataTipField
"
]
==
null
?
""
: Convert.ToString(ViewState[
"
DataTipField
"
], CultureInfo.CurrentCulture);
}
set
{ ViewState[
"
DataTipField
"
]
=
value; }
}
private
MyHyperCollection _items;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[PersistenceMode(PersistenceMode.InnerProperty)]
public
MyHyperCollection Items
{
get
{
if
(_items
==
null
)
{
_items
=
new
MyHyperCollection();
if
(
base
.IsTrackingViewState)
_items.TrackViewState();
}
return
_items;
}
}
protected
override
void
Render(HtmlTextWriter writer)
{
if
(Items.Count
>
0
)
{
RepeatInfo ri
=
new
RepeatInfo();
Style controlStyle
=
(
base
.ControlStyleCreated
?
base
.ControlStyle :
null
);
ri.RepeatColumns
=
RepeatColumns;
ri.RepeatDirection
=
RepeatDirection;
ri.RepeatLayout
=
RepeatLayout;
ri.RenderRepeater(writer,
this
, controlStyle,
this
);
}
}
//
***************************************************************************************************
//
METHOD CreateControlStyle
//
Create the style object to apply to the control
protected
override
Style CreateControlStyle()
{
return
new
TableStyle(
this
.ViewState);
}
#region
PerformDataBinding override
protected
override
void
PerformDataBinding(IEnumerable dataSource)
{
base
.PerformDataBinding(dataSource);
string
urlField
=
DataUrlField;
string
textField
=
DataTextField;
string
tooltipField
=
DataTipField;
if
(dataSource
!=
null
)
{
//
Fill Items
Items.Clear();
foreach
(
object
o
in
dataSource)
{
MyHyperItem item
=
new
MyHyperItem();
if
(DesignMode)
{
item.Src
=
"
DataBound
"
;
item.Text
=
"
DataBound
"
;
}
else
{
item.Src
=
DataBinder.GetPropertyValue(o, urlField,
null
);
item.Text
=
DataBinder.GetPropertyValue(o, textField,
null
);
item.Tip
=
DataBinder.GetPropertyValue(o, tooltipField,
null
);
}
Items.Add(item);
}
}
}
protected
override
void
LoadViewState(
object
savedState)
{
if
(savedState
!=
null
)
{
Pair p
=
savedState
as
Pair;
base
.LoadViewState(p.First);
Items.LoadViewState(p.Second);
}
else
{
base
.LoadViewState(
null
);
}
}
protected
override
object
SaveViewState()
{
object
baseObj
=
base
.SaveViewState();
object
itemObj
=
Items.SaveViewState();
if
((baseObj
==
null
)
&&
(itemObj
==
null
))
{
return
null
;
}
return
new
Pair(baseObj, itemObj);
}
private
HyperLink _controlToRepeat;
private
HyperLink ControlToRepeat
{
get
{
if
(_controlToRepeat
==
null
)
{
_controlToRepeat
=
new
HyperLink();
Controls.Add(_controlToRepeat);
}
return
_controlToRepeat;
}
}
public
virtual
RepeatDirection RepeatDirection
{
get
{
object
o
=
ViewState[
"
RepeatDirection
"
];
if
(o
!=
null
)
return
(RepeatDirection)o;
return
RepeatDirection.Vertical;
}
set
{
ViewState[
"
RepeatDirection
"
]
=
value;
}
}
//
***************************************************************************************************
//
PROPERTY RepeatColumns
//
Gets and sets the number of columns to render out
public
virtual
int
RepeatColumns
{
get
{
object
o
=
ViewState[
"
RepeatColumns
"
];
if
(o
!=
null
)
return
(
int
)o;
return
0
;
}
set
{
ViewState[
"
RepeatColumns
"
]
=
value;
}
}
//
***************************************************************************************************
//
PROPERTY RepeatLayout
//
Gets and sets the expected layout for the control's output (flow or table)
public
virtual
RepeatLayout RepeatLayout
{
get
{
object
o
=
ViewState[
"
RepeatLayout
"
];
if
(o
!=
null
)
return
(RepeatLayout)o;
return
RepeatLayout.Table;
}
set
{
ViewState[
"
RepeatLayout
"
]
=
value;
}
}
public
Style GetItemStyle(ListItemType itemType,
int
repeatIndex)
{
return
null
;
}
public
bool
HasFooter
{
get
{
return
false
; }
}
public
bool
HasHeader
{
get
{
return
false
; }
}
public
bool
HasSeparators
{
get
{
return
false
; }
}
public
void
RenderItem(ListItemType itemType,
int
repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer)
{
HyperLink ctl
=
ControlToRepeat;
int
i
=
repeatIndex;
ctl.ID
=
i.ToString();
ctl.Text
=
Items[i].Text;
ctl.NavigateUrl
=
Items[i].Src;
ctl.ToolTip
=
Items[i].Tip;
ctl.RenderControl(writer);
}
public
int
RepeatedItemCount
{
get
{
return
Items.Count; }
}
#endregion
}
public
class
MyHyperItem
{
private
string
_text;
private
string
_src;
private
string
_tip;
public
MyHyperItem() { }
public
MyHyperItem(
string
Text,
string
Src,
string
Tip)
{
_text
=
Text;
_src
=
Src;
_tip
=
Tip;
}
public
string
Text
{
get
{
return
_text; }
set
{ _text
=
value; }
}
public
string
Src
{
get
{
return
_src; }
set
{ _src
=
value; }
}
public
string
Tip
{
get
{
return
_tip; }
set
{ _tip
=
value; }
}
}
public
class
MyHyperCollection : Collection
<
MyHyperItem
>
,IStateManager
{
private
bool
_mark;
#region
IStateManager Members
public
bool
IsTrackingViewState
{
get
{
return
_mark; }
}
public
void
LoadViewState(
object
state)
{
//
if (state == null)
//
return;
if
(state
!=
null
)
{
Clear();
Triplet t
=
state
as
Triplet;
string
[] rgTip
=
t.First
as
string
[];
string
[] rgText
=
t.Second
as
string
[];
string
[] rgSrc
=
t.Third
as
string
[];
for
(
int
i
=
0
; i
<
rgSrc.Length; i
++
)
{
Add(
new
MyHyperItem(rgText[i], rgSrc[i], rgTip[i]));
}
}
}
public
object
SaveViewState()
{
int
nums
=
Count;
object
[] rgTip
=
new
string
[nums];
object
[] rgText
=
new
string
[nums];
object
[] rgSrc
=
new
string
[nums];
for
(
int
i
=
0
; i
<
nums; i
++
)
{
rgTip[i]
=
this
[i].Tip;
rgText[i]
=
this
[i].Text;
rgSrc[i]
=
this
[i].Src;
}
return
new
Triplet(rgSrc, rgText, rgTip);
}
public
void
TrackViewState()
{
_mark
=
true
;
}
#endregion
}
}
DownLoad