写了一个控件,显示效果如上。第一次页面打开可以正常显示,点击按钮回发后页面数据清空了,近段时间刚研究不久,
找了一上午问题,谢各位
namespace NewDataList
{
public class DataList : WebControl,INamingContainer
{
string _dataKeyField;
IEnumerable _dataSource;
ITemplate _itemTemplate;
int _topQuantity;
int _botRepeatColumn;
string _recommendKeyField;
string _imageKeyField;
string _imagePath;
string _imageHeight;
string _imageWidth; protected override void CreateChildControls()
{
Controls.Clear();
if (ViewState["_ItemCount"] != null)
CreateControlHierarchy(false); if (IsTrackingViewState)
TrackViewState();
} protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding(e);
Controls.Clear(); if (HasChildViewState)
ClearChildViewState(); CreateControlHierarchy(true);
ChildControlsCreated = true;
if (IsTrackingViewState)
TrackViewState();
} protected void CreateControlHierarchy(bool useDataSource)
{
IEnumerable data;
IEnumerator dataItems;
int itemCount;
int itemCounter = 0; if (!useDataSource)
{
itemCount = (int)ViewState["_ItemCount"];
data = new DummyDataSource(itemCount);
}
else
{
data = DataSource;
}
dataItems = data.GetEnumerator(); ArrayList list = new ArrayList();
ArrayList list2 = new ArrayList();
while (dataItems.MoveNext())//获得信息集合
{
//判断当前是否为推荐图片
if (dataItems.Current != null)
{
string recommend = DataBinder.GetPropertyValue(dataItems.Current, _recommendKeyField).ToString().Trim();
if (recommend == "0")
list.Add(dataItems.Current);
else
list2.Add(dataItems.Current);
}
itemCounter++;
} //填充图片表格
Table imgTable = new Table();
imgTable.ID = "imgTable";
imgTable.Width = Unit.Parse("100%");
imgTable.BorderWidth = Unit.Parse("0");
imgTable.CellPadding = 0;
imgTable.CellSpacing = 0;
for (int i = 0; i < list2.Count; i++)
{
TableRow imgRow = new TableRow();
DataListItem item = new DataListItem(list2[i]);
TableCell imgCell = new TableCell();
ItemTemplate.InstantiateIn(item);
Image img = new Image();
img.ImageUrl = ImagePath + "/" + DataBinder.GetPropertyValue(list2[i], ImageKeyField);
img.Height = Unit.Parse(Height.ToString());
img.Width = Unit.Parse(Width.ToString());
imgCell.Controls.Add(img);
imgRow.Cells.Add(imgCell);
imgTable.Rows.Add(imgRow);
item.TrackViewState();
} Table topTable = new Table();
topTable.ID = "topTable";
topTable.Width = Unit.Parse("100%");
topTable.BorderWidth = Unit.Parse("0");
topTable.CellPadding = 0;
topTable.CellSpacing = 0;
ArrayList topList = new ArrayList(); Table botTable = new Table();
botTable.ID = "botTable";
botTable.Width = Unit.Parse("100%");
botTable.BorderWidth = Unit.Parse("0");
botTable.CellPadding = 0;
botTable.CellSpacing = 0;
ArrayList botList = new ArrayList(); for (int i = 0; i < _topQuantity; i++)
{
if (list[i] != null)
topList.Add(list[i]);
} for (int i = _topQuantity; i < list.Count; i++)
{
if (list[i] != null)
botList.Add(list[i]);
} //分为两步,首先填充顶部表格,再次填充底部表格
for (int i = 0; i < topList.Count; i++)
{
DataListItem item = new DataListItem(topList[i]);
TableRow topRow = new TableRow();
TableCell topCell = new TableCell();
topCell.Width = Unit.Parse("100%");
ItemTemplate.InstantiateIn(item);
topCell.Controls.Add(item);
topRow.Cells.Add(topCell);
topTable.Rows.Add(topRow);
} for (int i = 0; i < botList.Count;)
{
TableRow botRow = new TableRow();
for (int k = 0; k < _botRepeatColumn; k++)
{
if (i >= list.Count - 1)
break;
TableCell botCell = new TableCell();
botCell.Width = Unit.Parse(Math.Round(Convert.ToDouble(100 / _botRepeatColumn)) + "%");
DataListItem item = new DataListItem(botList[i]);
ItemTemplate.InstantiateIn(item);
botCell.Controls.Add(item);
item.TrackViewState();
botRow.Cells.Add(botCell);
i = i + 1;
}
botTable.Rows.Add(botRow);
}
//创建主表格
Table mainTable = new Table();
mainTable.ID = "mainTable";
mainTable.Width = Unit.Parse("100%");
mainTable.BorderWidth = Unit.Parse("0");
mainTable.CellPadding = 0;
mainTable.CellSpacing = 0; TableRow mainRow = new TableRow();
TableCell mainCell = new TableCell();
//======================添加小表
Table sTable = new Table();
sTable.ID = "sTable";
sTable.Width = Unit.Parse("100%");
sTable.BorderWidth = Unit.Parse("0");
sTable.CellPadding = 0;
sTable.CellSpacing = 0;
TableRow sRow = new TableRow();
TableCell sCell = new TableCell();
sCell.Width = Unit.Parse("40%");
sCell.Style["valign"] = "top";
sCell.Style["align"] = "left";
sCell.Controls.Add(imgTable);
TableCell sCell2 = new TableCell();
sCell2.Width = Unit.Parse("60%");
sCell2.Controls.Add(topTable);
sRow.Cells.Add(sCell);
sRow.Cells.Add(sCell2);
sTable.Rows.Add(sRow); mainCell.Controls.Add(sTable);
mainRow.Cells.Add(mainCell); TableRow mainRow2 = new TableRow();
TableCell mainCell2 = new TableCell();
mainCell2.Controls.Add(botTable);
mainRow2.Cells.Add(mainCell2);
mainTable.Rows.Add(mainRow);
mainTable.Rows.Add(mainRow2); if (useDataSource)
ViewState["_ItemCount"] = itemCounter; Controls.Add(mainTable);
}
}
解决方案 »
- 做网页中frame和控件的问题
- 如何在一个sql2005的表中把一个ct的二进制列设为全文索引
- asp.net求带上传本地图片的副文本编辑器
- asp.net增加、修改、删除页面最简单的,请给个实例。
- #########100分急切求助解决方法,请大家帮忙#########
- IEWebcontrol中,Multipage 和 TabStrip 控件如何用?
- 高难度的DataList问题
- 共四帖〓〓〓〓〓〓〓〓控件开发的一个小问题 在线等
- 访问另一个页面的控件数据问题(菜鸟问题)今天结贴
- ASP.NET中怎么调用公共模块或公共函数
- 我的功能如何实现?
- ASP下怎么查看连接数据库的用户者数目?数据库是ACCESS
{
object _dataItem;
public DataListItem(object dataItem)
{
_dataItem = dataItem;
} public object DataItem
{
get { return _dataItem; }
set { _dataItem = value; }
} internal new void TrackViewState()
{
base.TrackViewState();
}
} internal sealed class DummyDataSource : IEnumerable
{
private int dataItemCount; public DummyDataSource(int dataItemCount)
{
this.dataItemCount = dataItemCount;
} public IEnumerator GetEnumerator()
{
return new DummyDataSourceEnumerator(dataItemCount);
} private class DummyDataSourceEnumerator : IEnumerator
{
private int count;
private int index; public DummyDataSourceEnumerator(int count)
{
this.count = count;
this.index = -1;
}
public object Current
{
get { return null; }
}
public bool MoveNext()
{
index++;
return index < count;
}
public void Reset()
{
this.index = -1;
}
}
}
}分两次发
调起来确实太麻烦了。看着头都晕了。正想着法换种方式来写。后期真用了维护确实是问题。