找不到TextBox的问题。

jacktion2004 2010-01-09 03:04:34
if (!IsPostBack)
{
this.cgvTarTask.DataSource = T_KPI_Annual_TarTaskMaster.getKPI_tarTask(0);
this.cgvTarTask.DataBind();
CreateControls();
DDLBind(null);
InitWFField();
}


private void CreateControls()
{
foreach (GridViewRow e in cgvTarTask.Rows)
{
int intRow = e.Cells.Count;
for (int intI = 1; intI < intRow; intI++)
{
CustTextBox textbox = new CustTextBox();
textbox.ID = "txt" + e.RowIndex.ToString() + intI.ToString();
textbox.IsValRegular = true;
textbox.InputType = CustTextBox.textType.Int;
textbox.MaxLength = 3;
textbox.MaxValue = "100";
textbox.MinValue = "0";
if (e.Cells[intI].Text.Trim() == " ")
{
textbox.Text = "0";
}
else
{
if (IsNumberic(e.Cells[intI].Text.Trim()))
textbox.Text = Convert.ToString(double.Parse(e.Cells[intI].Text.Trim()) * 100);
else
textbox.Text = e.Cells[intI].Text.Trim();
}
textbox.Width = Unit.Pixel(80);
e.Cells[intI].HorizontalAlign = HorizontalAlign.Center;
e.Cells[intI].Controls.Add(textbox);
}
//第一行不显示
if (e.RowIndex == 0 || e.RowIndex == 1)
{
e.Visible = false;
}
}
}


为什么在我Button点击保存时候,取不到生存时的TextBox呢?
详见:http://topic.csdn.net/u/20100108/17/e5dcffb6-397f-4ac3-98c6-0cad7ee9903d.html?1014271775
...全文
288 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
bianjijianjie 2010-01-10
  • 打赏
  • 举报
回复
把 VS2005删掉 就有植了
灵雨飘零 2010-01-10
  • 打赏
  • 举报
回复
学习。。。
gnimgnot 2010-01-10
  • 打赏
  • 举报
回复
用FindControl试试
yongnicheng 2010-01-10
  • 打赏
  • 举报
回复
ID命名规范问题, 后台取不到控件名称.....设置断点看看
waiwai1015 2010-01-10
  • 打赏
  • 举报
回复
顶一个吧.
mngzilin 2010-01-09
  • 打赏
  • 举报
回复
你这里可以更加简单的获取textbox,但是一定要将If(!IsPostback){}去掉才行,否则控件在回发后销毁了不会再重建,也就找不到控件了。

        protected void Button1_Click(object sender, EventArgs e)
{
foreach (GridViewRow r in GridView1.Rows)
{
for (int intI = 1; intI < r.Cells.Count; intI++)
{
TextBox textbox = r.FindControl("txt" + r.RowIndex.ToString() + intI.ToString()) as TextBox;
Response.Write(textbox.Text);
}
}
}
mngzilin 2010-01-09
  • 打赏
  • 举报
回复
我和荣幸的告诉你,你发现了一个有价值的问题,这个问题网上有递归遍历控件的办法可以找到textbox
为什么要递归呢,因为textbox有可能是在其他的容器中(如模板),正如sp123所说,这些容器继承了INameContainer接口,外边是无法访问到这些控件的。遍历通过findcontrol层层寻找,最终可以找到textbox。

递归方法如下:
//遍历控件
string temp = "";//保存获取到的所有textbox的值,值之间用逗号分隔
protected void SearchTxt(Control C)
{
ControlCollection CC;
if (C == null)
CC = Form.Controls;
else
CC = C.Controls;
for (int i = 0; i < CC.Count; i++)
{
if (CC[i].HasControls())//如果内部有控件,继续递归
StrStr += SearchTxt(CC[i]);
else if (CC[i].GetType() == typeof(TextBox))//如果发现textbox控件
{
temp += ((TextBox)CC[i]).Text+",";//获取textbox内容
}
else
continue;
}
}

调用时候直接:
SearchTxt(GridView1);
这样你就能获取到所有GridView1中textbox的值,值保存在temp中,格式如:asfasf,sfafs,sfa,fa,
yagebu1983 2010-01-09
  • 打赏
  • 举报
回复
ViewState是否禁用掉
li616992193_liyang 2010-01-09
  • 打赏
  • 举报
回复
又学到新知识了》呵呵》
wuyq11 2010-01-09
  • 打赏
  • 举报
回复
看看页面内容textbox是否存在和值
通过ViewState判断是否存在
for(int i=0;i<GridView1.Rows.Count;i++)
{
CustTextBox txtQUOTA = GridView1.Rows[i].FindControl("textbox" + i.ToString()) as CustTextBox;
if(txtQUOTA !=null)
{
}
}
或使用ITemplate模板列
jacktion2004 2010-01-09
  • 打赏
  • 举报
回复
加载

if (!IsPostBack)
{
this.cgvTarTask.DataSource = T_KPI_Annual_TarTaskMaster.getKPI_tarTask(0);
this.cgvTarTask.DataBind();
}
CreateControls();

生成控件
    private void CreateControls()
{
foreach (GridViewRow e in cgvTarTask.Rows)
{
int intRow = e.Cells.Count;
for (int intI = 1; intI < intRow; intI++)
{
CustTextBox textbox = new CustTextBox();
textbox.ID = String.Format("textbox{0}{1}", e.RowIndex.ToString(), intI.ToString());
textbox.IsValRegular = true;
textbox.InputType = CustTextBox.textType.Int;
textbox.MaxLength = 3;
textbox.MaxValue = "100";
textbox.MinValue = "0";
if (e.Cells[intI].Text.Trim() == " ")
{
textbox.Text = "0";
}
else
{
if (IsNumberic(e.Cells[intI].Text.Trim()))
textbox.Text = Convert.ToString(double.Parse(e.Cells[intI].Text.Trim()) * 100);
else
textbox.Text = e.Cells[intI].Text.Trim();
}
textbox.Width = Unit.Pixel(80);
e.Cells[intI].HorizontalAlign = HorizontalAlign.Center;
e.Cells[intI].Controls.Add(textbox);
}
//第一行不显示
if (e.RowIndex == 0 || e.RowIndex == 1)
{
e.Visible = false;
}
}
}


我在界面输入 50 。
CustTextBox txtQUOTA = gvr.Cells[intI].FindControl("textbox" + gvr.RowIndex.ToString() + intI.ToString()) as CustTextBox;

取得的文本框 是0: Text "0" string
mbh0210 2010-01-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 jacktion2004 的回复:]
如果是生成放在!IsPostBack外面的话,

当我点击Button保存数据的时候不是又生存了一次,这样我怎么取textbox里的数据呢?

因为我在生成控件的时候给控件赋值了。所以肯定会导致我在第一次生成控件的时候在界面上输入的值取不到的。
[/Quote]

你怎么这么肯定输入的值取不到?动手做做试试,在了解一下页面加载顺序。你就明白了
jacktion2004 2010-01-09
  • 打赏
  • 举报
回复
如果是生成放在!IsPostBack外面的话,

当我点击Button保存数据的时候不是又生存了一次,这样我怎么取textbox里的数据呢?

因为我在生成控件的时候给控件赋值了。所以肯定会导致我在第一次生成控件的时候在界面上输入的值取不到的。
qawszx 2010-01-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mbh0210 的回复:]
引用 12 楼 jacktion2004 的回复:
如果是生成放在!IsPostBack外面的话,当我点击Button保存数据的时候不是又生存了一次,这样我怎么取textbox里的数据呢?


看看asp。net的页面加载顺序。在生成一次会自动赋值的。没有啥问题
[/Quote]

同意
mbh0210 2010-01-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jacktion2004 的回复:]
如果是生成放在!IsPostBack外面的话,当我点击Button保存数据的时候不是又生存了一次,这样我怎么取textbox里的数据呢?
[/Quote]

看看asp。net的页面加载顺序。在生成一次会自动赋值的。没有啥问题
guyehanxinlei 2010-01-09
  • 打赏
  • 举报
回复
学习
jacktion2004 2010-01-09
  • 打赏
  • 举报
回复
如果我不动态生成TextBox,我怎么实现呢?因为我的GridView列是动态的。

如果我不动态生成TextBox,我怎么实现呢?因为我的GridView列是动态的。

如果我不动态生成TextBox,我怎么实现呢?因为我的GridView列是动态的。
qawszx 2010-01-09
  • 打赏
  • 举报
回复
因为TextBox是动态生成的,再提交页面PageLoad,这个控件就不存在了。
1、没必要用TextBox
2、没必要动态生成TextBox
jacktion2004 2010-01-09
  • 打赏
  • 举报
回复
如果是生成放在!IsPostBack外面的话,当我点击Button保存数据的时候不是又生存了一次,这样我怎么取textbox里的数据呢?

如果是生成放在!IsPostBack外面的话,当我点击Button保存数据的时候不是又生存了一次,这样我怎么取textbox里的数据呢?

如果是生成放在!IsPostBack外面的话,当我点击Button保存数据的时候不是又生存了一次,这样我怎么取textbox里的数据呢?

如果是生成放在!IsPostBack外面的话,当我点击Button保存数据的时候不是又生存了一次,这样我怎么取textbox里的数据呢?
jacktion2004 2010-01-09
  • 打赏
  • 举报
回复
如果是生成放在!IsPostBack外面的话,当我点击Button保存数据的时候不是又生存了一次,这样我怎么取textbox里的数据呢?
加载更多回复(11)

62,264

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧