有一个Formview,里面有一个TextBox控件。想在databinding事件中修改TextBox控件。但是网页报错说找不到该控件。代码如下:
    protected void FormView1_DataBinding(object sender, EventArgs e)
    {
        TextBox TextBoxUserName = (TextBox)FormView1.Row.FindControl("TextBoxRealName");    }错误是:System.NullReferenceException: Object reference not set to an instance of an object.请前辈执教。先谢谢大家的宝贵时间了。

解决方案 »

  1.   

    我每次找的时候没用用Row,就是说直接
    TextBox TextBoxUserName = (TextBox)FormView1.FindControl("TextBoxRealName");就找到了
      

  2.   

    看看页面运行的源代码文件,然后看看这个TextBox在客户端的ID
      

  3.   

    直接findbycontrol当然不行了,因为这个textbox控件不是直接放置在web上, 
    具体可以参考我这里给你的代码(这里是访问下拉框控件的,你改成textbox就是了):
     
    protected void FormView1_ItemCreated(object sender, EventArgs e) 

    DropDownList test; 
    switch (FormView1.CurrentMode) 

    case FormViewMode.Edit: 
    test = ((DropDownList)FormView1.Row.FindControl("DropDownList3")); 
    test.Attributes.Add("onchange", "FControl('" + test.UniqueID + "');"); 
    break; 
    case FormViewMode.Insert: 
    test = ((DropDownList)FormView1.Row.FindControl("DropDownList3")); 
    test.Attributes.Add("onchange", "FControl('" + test.UniqueID + "');"); 
    break; 


     
      

  4.   

    在ASP.Net 2.0中用FindControl代替getElementById使用ASP .Net 2.0发现一个很大问题是在Javascript无法直接使用getElementById。在ASP页面中的ID无法直接引用。  1:需要使用var CtrlCust=document.getElementById(<%Ctrl.ClientID%>);  2:但是如果控件是在FormView GridView DetailView就不行了,需要使用FindControl
    txBox=(TextBox)DataSourceItemView.FindControl("TextBox");
    先找到这个控件。然后txBox.ClientID, 并且Javascript需要在Page_Load中加载
      3:但是这里还有问题,方法2中只是适合Default View,如果View有了变化,例如原来是Readonly转换到EditTemplate的时候,EditTemplate里面的控件使用ItemView.Find无法找到。所以需要另外的方法。在Item_Created中加载Javascript
    我这里实现的是弹出窗口,返回一个数值
     
        protected void FormView1_ItemCreated(object sender, EventArgs e)
          {
              if (FormView1.CurrentMode == FormViewMode.Edit)
              {
                   TextBox CustTextBox = (TextBox)FormView1.FindControl("main_customerTextBox");
                  if (CustTextBox == null) return;
                  string js = "<script language='javascript'>";
                  js = js + "function findcust(CustButton)";
                  js = js + "{";
                  js = js + "       var ttop = CustButton.offsetTop; ";
                  js = js + "       var thei = CustButton.clientHeight;";
                  js = js + "       var tleft = CustButton.offsetLeft;";
                  js = js + "       while (CustButton = CustButton.offsetParent){ttop+=CustButton.offsetTop; tleft+=CustButton.offsetLeft;}";              js = js + "       var returnValue=window.showModalDialog('../Common/CommonFindCustomer.aspx','Pass paramerter to Child Window','dialogWidth:600px;dialogHeight:500px;dialogLeft:'+tleft+';dialogTop:'+ttop+';resizable:yes ');";
                  js = js + "       if (returnValue == null) return;";              js = js + "       var CtrlCust=document.getElementById('" + CustTextBox.ClientID + "');";
                  js = js + "       if (CtrlCust==null)";
                  js = js + "          alert('Not Found Customer Control');";
                  js = js + "       else";
                  js = js + "          CtrlCust.value=returnValue;";
                  js = js + "}</script>";              ClientScript.RegisterStartupScript(this.GetType(),"FindCustScript", js);
              }
      

  5.   

    关于Asp.net的FormView控件中,用FindControl方法找不到对应控件问题在FormView控件的不同模版里,通过编辑模版,使用了多个控件。利用FormView的FindControl查找控件引用的时候,有时候出现找不到控件的情况。原因:主要根FormView控件的运行机制有关。FormView的DefaultMode和CurrentMode属性决定其当前运行的模版是哪个,同时相应调用相关的sql语句和后台数据进行交互绑定。如果状态为ReadOnly或Edit,而此时的查询语句没有检索到任何数据(对应查询结果的行),那么FormView没有任何东西可以显示,故里面的所有控件可以认为没有进行初始化。这时,用FindControl当然就找不到任何对应的控件的引用。  <我出错的原因就是select语句中的参数初始时没有赋值导致没有检索到任何数据>有趣的一点是,如果当前为insert模式时,因为其不必调用对应的insert方法先期绑定数据,所以可以认为FormView始终初始化所有控件,这时的FindControl就不会出任何问题。顺便提一点,FormView的不同模版里,控件可以使用同一个id。例如,在不同模版里都有一个id一样的TextBox,这是可以的。因为最终只会有一份模版进行实例化并显示。
    这样可以带来一定好处:
    1、代码比较好写(不用对应多个不同模版的不同id的同种控件写冗余代码);
    2、ViewState(页面状态)可以平滑‘继承’(因为某些控件也许不需要数据绑定,这样FormView在不同模式下切换时,因为id一样,viewstate得以保留。当然,如果不同模版里的同一个id对应不同类型控件,结果可能就糟糕了,例如一个label和一个textbox的id一样)第二点有误,经过测试,ViewState在不同模式间切换后没有保留。应该是FormView在模式切换中有一个删除ViewState的过程。当然从效率角度上来讲也确实应该这样。