ASP.NET后台无法引用ListView插入模板内TextBox输入值问题
问题原因
- 放在
ListView的InsertItemTemplate模板内的控件,属于模板子容器的成员,不会直接作为页面类的全局控件成员存在,所以直接用TaskNameTextBox.Text访问会提示不存在于当前上下文。 - 直接调用
ListViewWorkTypes.FindControl也找不到目标控件,因为控件是挂载在InsertItem(插入项容器)下,不是直接挂载在ListView根节点下。 - 用
Request.Form拿不到值是因为服务端控件渲染到前端时ID会自动加上父容器的前缀,实际前端name属性不是纯TaskNameTextBox,所以直接用原ID取不到。
解决方法
直接从ListView的InsertItem属性里查找对应控件即可,修正后的后台代码参考:
protected void InsertType(object sender, EventArgs e) { string Name = ""; int BaseValue = 0; bool LOE; int ordr; char operation; int Opt1 = 0; int Opt2 = 0; int Opt3 = 0; int Opt4 = 0; int Opt5 = 0; int TypeID = 0; string strtypecon = WebConfigurationManager.ConnectionStrings["DefaultEstimateConnection"].ConnectionString; SqlConnection typeconx = new SqlConnection(strtypecon); SqlCommand TypeCmd = new SqlCommand() { Connection = typeconx }; // 正确获取插入项模板内控件的方式 if (ListViewWorkTypes.InsertItem != null) { // 先在InsertItem容器内查找文本框 TextBox txtTaskName = (TextBox)ListViewWorkTypes.InsertItem.FindControl("TaskNameTextBox"); if (txtTaskName != null) { Name = txtTaskName.Text; } // 其他控件同理获取,比如下拉框: DropDownList ddlPhase = (DropDownList)ListViewWorkTypes.InsertItem.FindControl("PhaseDropDown"); TextBox txtBaseValue = (TextBox)ListViewWorkTypes.InsertItem.FindControl("BaseValueTextBox"); // 剩下的Opt1~Opt5对应的文本框、排序、运算符等控件都按这个方式取即可 } TypeCmd.Parameters.AddWithValue("@Name", Name); // 后续你的数据库操作逻辑 }
注意事项
所有模板内的控件(包括文本框、下拉框)都要用这种方式获取,不要直接用ID访问,查找之后做空判断可以避免插入项未加载时的空引用异常。
内容的提问来源于stack exchange,提问作者MDDeVane
相关产品推荐
相关产品推荐

