当前位置:编程学习 > C#/ASP.NET >>

GridView动态生成TextBox模板列后如何取值的问题

各位好,这个问题以前有人提过了,但是我研究了好几天用到我的程序里就总出现问题,希望高手能够帮帮忙,谢谢!

我需要用GridView动态生成列数不固定的模板列,然后在里面添加textbox控件后,由用户输入数值,然后将这些值获取出来。但是我运行到这里就总是出现错误说  “既不是表的DataColumn也不是表的DataRelation”。代码如下:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class SOD_analysisvariance_2 : System.Web.UI.Page
{
    private static int colNum;
    private static int rowNum;
    private DataTable dtResult;
    
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void btnNext_Click(object sender, EventArgs e)
    {
        this.div1.Visible = true;
        colNum = int.Parse(this.tbxBnum.Text);
        rowNum = int.Parse(this.tbxAnum.Text);
        DataTable dtData = this.GetDataTable(colNum, rowNum);
        this.GridViewBind(this.gvwData, dtData, colNum);
        for (int i = 0; i < rowNum; i++)
        {
            string rowName = string.Format("A {0}水平", i + 1);
            this.gvwData.Rows[i].Cells[0].Text = rowName;
        } 
    }

    private DataTable GetDataTable(int colNum,int rowNum)
    {
        DataTable dt = new DataTable();
        for (int i = 0; i < colNum; i++)
        {
            DataColumn dc = new DataColumn();
            dt.Columns.Add(dc);
        }
        for (int i = 0; i < rowNum; i++)
        {
            DataRow dr = dt.NewRow();
            dt.Rows.Add(dr);
        }
        return dt;
    }


    /// <summary>
    /// 绑定生成GridView
    /// </summary>
    /// <param name="gdv">要绑定的GridView</param>
    /// <param name="dtblDataSource">GridView的数据源</param>
    public void GridViewBind(GridView gdv, DataTable dtblDataSource,int colNum)
    {
        gdv.Columns.Clear();
        gdv.AutoGenerateColumns = false;
        gdv.DataSource = dtblDataSource;
        ////第1列
        //TemplateField column = new TemplateField();

        //column.HeaderText = "A/B";
        //gdv.Columns.Add(column);
        //数据输入列
        for (int i = 0; i < colNum; i++)
        {
            TemplateField tfColumn = new TemplateField();
            //tfColumn.HeaderText = string.Format("B {0}水平", i + 1);
            string colName = string.Format("B {0}水平", i + 1);
            tfColumn.HeaderTemplate = new MyTemplate(colName, DataControlRowType.Header);
            tfColumn.ItemTemplate = new MyTemplate("", DataControlRowType.DataRow);            
            gdv.Columns.Add(tfColumn);
        }
        gdv.DataBind();
    }


    protected void btnOk_Click(object sender, EventArgs e)
    {
        this.div2.Visible = true;
        for (int i = 0; i < rowNum+1; i++)
        {
             int count = this.gvwData.Rows[i].Cells[2].Controls.Count;
             TextBox tb = (TextBox)this.gvwData.Rows[i].Cells[1].FindControl("TextBox1");
             string value = tb.Text;

        }

        //dtResult = this.BindDataResultTable();
        this.gvwDataResult.DataSource = dtResult;
        this.gvwDataResult.DataBind();
   }
}

public class MyTemplate:ITemplate
 {
    private string strColumnName;
    private DataControlRowType dcrtColumnType;

    /// <summary>
    /// 动态添加模板列
    /// </summary>
    /// <param name="strColumnName">列名</param>
    /// <param name="dcrtColumnType">列的类型</param>
    public MyTemplate(string strColumnName, DataControlRowType dcrtColumnType)
    {
        this.strColumnName = strColumnName;
        this.dcrtColumnType = dcrtColumnType;
    }

    public void InstantiateIn(Control ctlContainer)
    {
        switch (dcrtColumnType)
         {
            case DataControlRowType.Header: //列标题
                Literal ltr = new Literal();
                ltr.Text = strColumnName;
                ctlContainer.Controls.Add(ltr);
                break;
            case DataControlRowType.DataRow: //模板列内容——加载TextBox 
                TextBox tb = new TextBox();
                tb.ID="TextBox1";
                tb.BorderWidth = 0;
                tb.Enabled = true;
                tb.DataBinding += new EventHandler(this.OnDataBinding);     
                ctlContainer.Controls.Add(tb);
                break;
        }
    }
    public void OnDataBinding(object sender, EventArgs e)
    {
        TextBox txb = (TextBox)sender;//TextBox发送绑定请求     
        GridViewRow container = (GridViewRow)txb.NamingContainer;
        txb.Text = ((DataRowView)container.DataItem)[strColName].ToString();
    }    

} --------------------编程问答-------------------- 运行到这里:txb.Text = ((DataRowView)container.DataItem)[strColName].ToString(); 
提示说:
strColName既不是表的DataColumn也不是表的DataRelation --------------------编程问答-------------------- 我今天也要做这个东西,我把strColName改成数据源的列名就可以了,比如:"Grade"
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,