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