我在网上找到了一写代码实现了数据绑定后显示数据库中一列值,但怎么显示多列值呢?加了一个索引却不会用,忘高手能指点一下
//要显示的某一列的值
public string DataTextField
{
set
{
this.dataTextField = value;
}
get
{
return this.dataTextField;
}
}
//数据源
public object DataSource
{
set
{
this.dataSource=value;
}
get
{
return this.dataSource;
}
}
//字段名索引器
public string this[string index]
{
get
{
if (this.item is IDataReader)
return ((IDataRecord)item)[index].ToString();
else if (this.item is DataRowView)
return ((DataRowView)item)[index].ToString();
else
return item.ToString();
}
}
public IEnumerator item;
/// <summary>
/// 处理数据源,转换成IEnumerable,方便进行下一步操作
/// </summary>
/// <param name="source">数据源,先统一装箱</param>
/// <returns>数据源的IEnumerable形式</returns>
private IEnumerable getResolvedDataSource(object source)
{
if (source is IEnumerable)
return (IEnumerable)source;
else if (source is IList)
return (IEnumerable)source;
else if (source is DataSet )
return (IEnumerable)(((DataSet)source).Tables[0].DefaultView);
else if (source is DataTable)
return (IEnumerable)(((DataTable)source).DefaultView);
else
return null;
}
/// <summary>
/// 从已转化为IEnumerable的数据源的一行中取出需要的DataTextField规定的数据
/// </summary>
/// <param name="item">已转化为IEnumerable的数据源的一行数据</param>
/// <returns>取得的数据的string形式</returns>
private string getDataItem(object item)
{
if (item is IDataRecord)
return ((IDataRecord)item)[this.dataTextField].ToString();
else if (item is DataRowView)
{
return ((DataRowView)item)[this.dataTextField].ToString();
}
else
return item.ToString();
}
//用来存放数据的ArrayList,这个也配合ViewState使用
private ArrayList cacheList= new ArrayList();
/// <summary>
/// 处理DataBinding事件,把数据源中需要的数据加到一个ArrayList中。
/// </summary>
/// <param name="e">EventArgs</param>
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding(e);
if (this.dataSource != null)
{
//如果Count为0,则表示是第一次加载
if (this.cacheList.Count == 0 )
{
IEnumerable source = this.getResolvedDataSource(this.dataSource);
item = source.GetEnumerator();
while (item.MoveNext())
{
//保存数据
this.cacheList.Add(this.getDataItem(item.Current));
}
}
}
}
/// <summary>
/// 保存自页回发到服务器后发生的任何服务器控件视图状态更改。
/// </summary>
/// <returns>返回服务器控件的当前视图状态。</returns>
protected override object SaveViewState()
{
object[] vState = new object[] { base.SaveViewState(), this.cacheList };
return vState;
}
/// <summary>
///从 SaveViewState 方法保存的上一个页请求还原视图状态信息。
/// </summary>
/// <param name="savedState">表示要还原的控件状态的 Object</param>
protected override void LoadViewState(object savedState)
{
if (savedState != null)
{
object[] vState = (object[])savedState;
if (vState[0] != null)
base.LoadViewState(vState[0]);
if (vState[1] != null)
this.cacheList = (ArrayList)vState[1];
}
}
protected override void Render(HtmlTextWriter writer)
{
foreach (string s in this.cacheList)
{
writer.RenderBeginTag(HtmlTextWriterTag.Div);
writer.Write(s);
writer.RenderEndTag();
}
要是显示多列的话,直接对数据源dt操作,合并多列,
提前定义一个字段就好像你的那个this〔index〕,然后,在绑定的时候,绑定已经处理过的dt,
dt.要把你需要显示的列合并成一列,用符号分割。然后绑定到显示列上。ok。显示多列值了