FineUI 官方论坛

标题: 动态生成的模板列中含有TextBox,虽然给了ID,找到控件 [打印本页]

作者: shiningrise    时间: 2012-10-16 01:39
标题: 动态生成的模板列中含有TextBox,虽然给了ID,找到控件
本帖最后由 shiningrise 于 2012-10-16 12:07 编辑

动态生成的模板列中含有TextBox,虽然给了ID,但还是i同办法FindControl找到这个控件

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Text;
using System.IO;
using AspNet = System.Web.UI.WebControls;

namespace ExtAspNet.Examples.data
{

    public class GenderTemplate : ITemplate
    {

        public void InstantiateIn(System.Web.UI.Control container)
        {
            AspNet.TextBox labGender = new AspNet.TextBox();
            labGender.ID = "tbxSex";
            labGender.DataBinding += new EventHandler(labGender_DataBinding);
            container.Controls.Add(labGender);
        }

        private void labGender_DataBinding(object sender, EventArgs e)
        {
            AspNet.TextBox labGender = (AspNet.TextBox)sender;

            IDataItemContainer dataItemContainer = (IDataItemContainer)labGender.NamingContainer;

            string gender = ((DataRowView)dataItemContainer.DataItem)["Gender"].ToString();

            labGender.Text = gender;
        }

    }

    public partial class grid_dynamic_columns2 : PageBase
    {
        #region Page_Init

        // 注意:动态创建的代码需要放置于Page_Init(不是Page_Load),这样每次构造页面时都会执行
        protected void Page_Init(object sender, EventArgs e)
        {
            InitGrid();
        }

        private void InitGrid()
        {
            ExtAspNet.BoundField bf;

            bf = new ExtAspNet.BoundField();
            bf.DataField = "Id";
            bf.DataFormatString = "{0}";
            bf.HeaderText = "编号";
            Grid1.Columns.Add(bf);

            bf = new ExtAspNet.BoundField();
            bf.DataField = "Name";
            bf.DataFormatString = "{0}";
            bf.HeaderText = "姓名";
            Grid1.Columns.Add(bf);

            bf = new ExtAspNet.BoundField();
            bf.DataField = "EntranceYear";
            bf.DataFormatString = "{0}";
            bf.HeaderText = "入学年份";
            Grid1.Columns.Add(bf);

            bf = new ExtAspNet.BoundField();
            bf.DataToolTipField = "Major";
            bf.DataField = "Major";
            bf.DataFormatString = "{0}";
            bf.HeaderText = "所学专业";
            bf.ExpandUnusedSpace = true;
            Grid1.Columns.Add(bf);

            ExtAspNet.TemplateField tf = new TemplateField();
            tf.Width = Unit.Pixel(100);
            tf.HeaderText = "性别(模板列)";
            tf.ItemTemplate = new GenderTemplate();
            Grid1.Columns.Add(tf);


            Grid1.DataKeyNames = new string[] { "Id", "Name" };
        }

        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LoadData();
            }
        }

        #region LoadData

        private void LoadData()
        {
            DataTable table = GetDataTable();

            Grid1.DataSource = table;
            Grid1.DataBind();
        }

        #endregion

        protected void Button1_Click(object sender, EventArgs e)
        {
            string strSex = string.Empty;;
            labResult.Text = HowManyRowsAreSelected(Grid1);
            for (int i = 0; i < this.Grid1.Rows.Count; i++)
            {
                TextBox tbxSex = (TextBox)this.Grid1.Rows.FindControl("tbxSex");
                if (tbxSex != null)//永远取不值
                {
                    strSex += tbxSex.Text;
                }
            }
            Alert.ShowInTop(strSex);
        }

    }
}

动态生的控件,回发时并没有public void InitTemplateContainers(),所以FindControl打不到这个控件
public void InitTemplateContainers()
下面这样改后可以正常使用:但不是长久之计,,还是要改进控件比较好,俱觉得 
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LoadData();
            }
            else
            {
                foreach (var item in this.Grid1.Rows)
                {
                    item.InitTemplateContainers();

                }
             //   this.Grid1.UpdateTemplateFields();
            }
        }
找到方法了:
  在Grid类的LoadPostData方法中中加入
        public override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
        {
    //恢复动态模块控件树              if( row.TemplateContainers == null )
{
             foreach (var row in this.Rows)
                {
                   row.InitTemplateContainers();
                }
}









作者: shiningrise    时间: 2012-10-22 07:50
为了更好使用模板列
我作了以下改动,建议更新到官方源文件里GridRow.cs
/// <summary>
        /// 初始化模板容器
        /// </summary>
        public void InitTemplateContainers()
        {
            GridColumnCollection columns = _grid.AllColumns;
            if (TemplateContainers == null)
            {
                TemplateContainers = new GridRowControl[columns.Count];
            }
//针动动态添加的模板列,要相应增加TemplateContainers的长度
if (TemplateContainers.Length < columns.Count)
            {
                GridRowControl[] newGridRowControlContainers = new GridRowControl[columns.Count];
                for (int i = 0; i < TemplateContainers.Length; i++)
                {
                    newGridRowControlContainers[i] = TemplateContainers[i];
                }
                TemplateContainers = newGridRowControlContainers;
            }

            for (int i = 0, count = columns.Count; i < count; i++)
            {
                GridColumn column = columns;
                if (column is TemplateField)
                {
                    if (TemplateContainers[column.ColumnIndex] == null)
                    {
                        TemplateField field = column as TemplateField;
                        GridRowControl control = new GridRowControl(DataItem, RowIndex);
                        //control.ID = String.Format("{0}_{1}_{2}", Grid.ID, RowIndex, column.ColumnIndex);
                        control.ID = String.Format("c{0}r{1}", column.ColumnIndex, RowIndex);

                        field.ItemTemplate.InstantiateIn(control);

                        Controls.Add(control);
                        TemplateContainers[column.ColumnIndex] = control;
                    }
                }

            }
        }


Grid.cs
        /// <summary>
        /// 处理回发数据
        /// </summary>
        /// <param name="postDataKey">回发数据键</param>
        /// <param name="postCollection">回发数据集</param>
        /// <returns>回发数据是否改变</returns>
        public override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
        {
            //检查并恢复GridRow模板列(包括动态模板列)
            foreach (var row in this.Rows)
            {
                row.InitTemplateContainers();
            }



作者: iaimg    时间: 2012-10-31 02:25
我也遇到了这样的问题




欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/) Powered by Discuz! X3.4