ASP.NET报错TextBox1不存在上下文 如何将txt文件内容写入FormView内文本框
ASP.NET WebForm FormView模板内TextBox报错“TextBox1 does not exist in this context”问题解决
问题根因
- 放在
FormView、GridView这类数据绑定控件模板内的控件,不会自动生成ASPX页面对应类的全局实例字段,所以后台代码直接通过IDTextBox1访问时,编译器会提示上下文不存在该对象。 - 只有当
FormView完成数据绑定、且当前处于ItemTemplate对应的展示模式时,ItemTemplate内的控件才会被实例化渲染,提前访问也会找不到对象。
解决方案
1. 触发FormView模板初始化
首先需要给FormView触发一次数据绑定,哪怕没有数据库数据源,也可以传入空对象触发模板控件生成,在Page_Load中添加逻辑:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 传入空对象触发绑定,生成ItemTemplate内的控件 FormView1.DataSource = new object[] { new { } }; FormView1.DataBind(); // 绑定完成后读取txt文件赋值给TextBox LoadTxtContentToTextBox(); } }
2. 用FindControl方法获取模板内的TextBox
绑定完成后通过FormView的FindControl方法定位模板内的控件,再做赋值操作:
private void LoadTxtContentToTextBox() { // 确认FormView当前处于ItemTemplate对应的只读模式 if (FormView1.CurrentMode == FormViewMode.ReadOnly) { TextBox textBox1 = FormView1.FindControl("TextBox1") as TextBox; if (textBox1 != null) { // 读取txt文件内容,站点内文件推荐用Server.MapPath获取物理路径 string txtContent = File.ReadAllText(Server.MapPath("~/你的文件路径/xxx.txt"), System.Text.Encoding.UTF8); textBox1.Text = txtContent; } } }
注意事项
- 如果你的TextBox放在
EditItemTemplate内,只需要把模式判断条件改为FormView1.CurrentMode == FormViewMode.Edit即可。 - 每次FormView重新绑定数据、切换模式后,都需要重新调用
FindControl获取控件实例,模板内控件会随页面生命周期重新生成,不会保留全局实例。
内容的提问来源于stack exchange,提问作者Darren C
相关产品推荐
相关产品推荐

