You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:57:05