首页 新闻 会员 周边 捐助

关于自定义控件数据绑定的问题

0
悬赏园豆:60 [已解决问题] 解决于 2009-05-07 16:56

我在网上找到了一写代码实现了数据绑定后显示数据库中一列值,但怎么显示多列值呢?加了一个索引却不会用,忘高手能指点一下

//要显示的某一列的值

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();
            }

问题补充: 我要显示的多列值是给不同的label是不同的列值分别显示出来。这样可以吗?
宪华的主页 宪华 | 初学一级 | 园豆:0
提问于:2009-05-07 08:15
< >
分享
最佳答案
0

要是显示多列的话,直接对数据源dt操作,合并多列,

提前定义一个字段就好像你的那个this〔index〕,然后,在绑定的时候,绑定已经处理过的dt,

dt.要把你需要显示的列合并成一列,用符号分割。然后绑定到显示列上。ok。显示多列值了

邢少 | 专家六级 |园豆:10926 | 2009-05-07 08:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册